Opencv 使用rxjava实现正确的视频流

Opencv 使用rxjava实现正确的视频流,opencv,rx-java,Opencv,Rx Java,为了处理来自网络摄像头(由opencv提供)的视频流,我正在考虑使用RxJava 我希望实现以下目标: 能够控制每秒传送的帧数 能够处理不同的输入-例如生活网络摄像头、视频甚至静止图片 能够在gui的控制下切换到逐图处理 我已经用RxJava做了一些实验,但我对去盎司、节流和节流的特性感到困惑 例如,示例显示了一些代码,但我缺少更详细的解释 我在哪里可以找到一个像样的视频处理或类似的例子来满足上述需求? 下面的代码此时执行一些非异步逻辑-请告诉我是否可以在此基础上构建: 图像获取程序 imp

为了处理来自网络摄像头(由opencv提供)的视频流,我正在考虑使用RxJava

我希望实现以下目标:

  • 能够控制每秒传送的帧数
  • 能够处理不同的输入-例如生活网络摄像头、视频甚至静止图片
  • 能够在gui的控制下切换到逐图处理
我已经用RxJava做了一些实验,但我对去盎司、节流和节流的特性感到困惑

例如,示例显示了一些代码,但我缺少更详细的解释

我在哪里可以找到一个像样的视频处理或类似的例子来满足上述需求?

下面的代码此时执行一些非异步逻辑-请告诉我是否可以在此基础上构建:

图像获取程序

import org.opencv.core.Mat;
导入org.opencv.videoio.VideoCapture;
进口接收。可观察;
导入rx.functions.Action1;
导入rx.functions.Func0;
导入rx.functions.Func1;
/**
*图像抓取器
*
*/
公共类图像获取程序{
//OpenCV视频捕获
私有视频捕获=新视频捕获();
私有字符串源;
受保护的整数帧索引;
public int getFrameIndex(){
返回帧索引;
}
/**
*从给定源获取
* 
*@param源
*-要从中获取的源
*/
公共ImageFetcher(字符串源){
this.source=源;
}
/**
*尝试打开我的源代码
* 
*@如果成功返回true
*/
公共布尔开放(){
布尔ret=this.capture.open(源代码);
frameIndex=0;
返回ret;
}
/**
*获取图像矩阵
* 
*@return-已获取图像
*/
公共Mat fetch(){
如果(!this.capture.isOpened()){
布尔ret=this.open();
如果(!ret){
String msg=String.format(
“尝试从未打开的VideoCapture获取图像并打开%s失败”,
来源);
抛出新的非法状态异常(msg);
}
}
最终垫架=新垫();
这个。捕获。读取(帧);
frameIndex++;
return!frame.empty()?frame:null;
}
@凌驾
受保护的void finalize()抛出可丢弃的{
super.finalize();
}
/**
*把我变成一个可观察的人
*@返回一个可观察到的对象
*/
公共可观察到的到可观察到的(){
//资源创建。
Func0 resourceFactory=()->{
VideoCapture=新的VideoCapture();
捕获。开源;
返回捕获;
};
//转化为可观察的。
Func1 observableFactory=捕获->可观察
.创建(订阅服务器->{
布尔hasNext=true;
while(hasNext){
最终Mat帧=this.fetch();
hasNext=frame!=null&&frame.rows()>0&&frame.cols()>0;
如果(下一步){
String msg=String.format(“->%6d:%4dx%d”,frameIndex,frame.cols(),frame.rows());
System.out.println(msg);
订户.onNext(帧);
}
}
subscriber.onCompleted();
});
//处理功能。
Action1 dispose=VideoCapture::release;
返回可观察。使用(resourceFactory、observableFactory、dispose);
}
}
ImageSubscriber

import org.opencv.core.Mat;
输入接收用户;
公共类ImageSubscriber扩展了订阅服务器{
公众可抛弃错误;
公共int cols=0;
公共int行=0;
公共int frameIndex=0;
public boolean completed=false;
公共布尔调试=false;
@凌驾
未完成的公共无效(){
完成=正确;
}
@凌驾
公共无效申报人(可丢弃的e){
误差=e;
}
@凌驾
公共空间onNext(Mat Mat){
cols=mat.cols();
行=mat.rows();
frameIndex++;
if(cols==0 | | rows==0)
System.err.println(“无效帧”+帧索引);
如果(调试){
String msg=String.format(“%6d:%4dx%d”,帧索引,列,行);
System.out.println(msg);
}
}
};