我想使用OpenCV方法在视频文件中进行背景扣除.现在我可以做背景减法,但问题是我无法在彩色模式下获得输出.减去背景后的所有输出都是以灰度颜色模式进行的:(.我想获取前景的颜色信息,这是减去背景后的结果输出.
我可以用掩蔽技术吗?像我正在考虑的以下程序.
InputFrame(RGB)InputFrameTempFrame(以灰度显示:()TempFrameInputFrameOutFrame我很惊讶使用OpenCV进行屏蔽.我只是OpenCV的初学者.请帮助我克服这一点.
提前致谢.
我正在开发一个机器人项目,使用Android手机作为主处理器和相机来检测运动.我从OpenCV获得了Android二进制包并正确安装.我可以使用OpenCV原生相机捕捉图像并将其显示在屏幕上.但是我在使用背景减法类时遇到了问题.我可以在构造函数中创建一个新的BackgroundSubtractorMOG对象,但是当我尝试运行下面的代码时,它强制退出我从本机代码中得到错误"BackgroundSubtractorMOG中仅支持1-和3通道8位图像".我尝试将Highgui.CV_CAP_ANDROID_COLOR_FRAME_RGBA更改为Highgui.CV_CAP_ANDROID_COLOR_FRAME_RGB,然后它不强制退出,但我得到的只是一个黑屏.我很确定使用FRAME_RGB,bmp仍然为null,因为屏幕保持黑色,并且我在位图之后绘制的fps计数器(从下面发布的代码中移除以便清晰并作为故障排除步骤)不会显示.
我看了一下这个函数的OpenCV C++代码(这里是第388行),如果图像类型不是CV_8UC1或CV_8UC3,则会出现图像类型错误,所以我尝试使用java CvType.CV_8UC3而不是Highgui.CV_CAP_ANDROID_COLOR_FRAME_RGBA capture.retrieve(),但它强制关闭,我得到了"不支持输出帧格式"错误.
我猜我刚刚遇到类型转换问题,但我无法弄清楚OpenCV的Android特定图像类型与其记录的常规图像类型相适应的生活.任何帮助,将不胜感激.
变量:
private SurfaceHolder mHolder;
private VideoCapture mCamera;
private Mat mRgba;
private Mat mFGMask;
private BackgroundSubtractorMOG mBGSub;
Run Code Online (Sandbox Code Playgroud)
我的SurfaceView的run()函数:
public void run() {
Bitmap bmp = null;
synchronized (this) {
if (mCamera == null)
break;
if (!mCamera.grab()) {
Log.e(TAG, "mCamera.grab() failed");
break;
}
processFrame(mCamera);
bmp = Bitmap.createBitmap(mFGMask.cols(), mFGMask.rows(), Bitmap.Config.ARGB_8888);
Utils.matToBitmap(mFGMask, bmp);
}
if (bmp != null) {
Canvas canvas = mHolder.lockCanvas();
if (canvas != null) {
canvas.drawBitmap(bmp, (canvas.getWidth() - bmp.getWidth()) …Run Code Online (Sandbox Code Playgroud) 我想用网络摄像头跟踪激光光点(在墙上),我正在使用openCV来完成这项任务.任何人都可以建议我用C++来做到这一点.
谢谢 !
如何告诉BackgroundSubtractorMOG2哪些像素要更新到背景模型以及哪些像素不应该更新.
当一个物体进入场景并停止几十秒钟时,我面临问题,物体将被吸收到背景模型中.
我想降低学习率或停止围绕特定停止对象的学习,但我该怎么做呢?BackgroundSubtractorMOG2是否支持在其更新功能中使用掩码?
我正在使用OpenCV 2.4.1.
谢谢,阿尔文.
OpenCV库版本2.42.我想在BackgroundSubtractorMOG2对象中设置一个参数,例如
BackgroundSubtractorMOG2 bgr;
// the following doesn't work because 'nmixtures', 'backgroundRatio'
// and 'fVarMin' are a protected members.
bgr.nmixtures = 3;
bgr.backgroundRatio = 0.9;
bgr.fVarMin = 5;
// the following works
bgr.set('nmixtures', 3);
// both of the following lines will give a run-time error
// `Access violation reading location 0x0000000000000008.`
bgr.set("backgroundRatio", 0.9);
bgr.set("fVarMin", 5);
Run Code Online (Sandbox Code Playgroud)
backgroundRatio并且fVarMin是控制算法的参数.用户应该能够根据文档更改这些参数.
我该如何设置参数BackgroundSubtractorMOG2?
编辑正如下面的答案中正确提到的,这是OpenCV中的一个错误.该错误已在OpenCV版本2.4.6中修复.
似乎更改BackgroundSubtractorMOG的参数不会影响算法的结果.
我使用的是Python:2.7.6 | Anaconda 2.1.0(64位)
OpenCV:'2.4.10'OS
:Windows 7 x64
算法的默认参数是:
history=200, nmixtures=5, backgroundRatio=0.7
Run Code Online (Sandbox Code Playgroud)
因此,创建具有不同参数的背景减法器应该给出不同的结果.但我总是使用默认参数和自定义参数获得相同的结果(前景蒙版).
首先,使用不同的参数创建两个背景减法器对象:
bg1 = cv2.BackgroundSubtractorMOG()
bg2 = cv2.BackgroundSubtractorMOG(history=3, nmixtures=5, backgroundRatio=0.0001)
Run Code Online (Sandbox Code Playgroud)
创建2个"VideoCaptrue"对象:
cap = cv2.VideoCapture('video.mp4')
cap2 = cv2.VideoCapture('different_video.mp4')
Run Code Online (Sandbox Code Playgroud)
测试结果:
# Get a frame from the first capturing object:
frame = cap.read()[1]
# Get the foreground mask from both background subtractors:
fg1 = bg1.apply(frame)
fg2 = bg2.apply(frame)
# Show both results and the difference between them:
cv2.imshow('Window name', np.hstack((fg1, fg2, fg1 - fg2)))
cv2.waitKey(30)
Run Code Online (Sandbox Code Playgroud)
在为某些帧运行该代码块之后,该窗口显示来自第一个背景减法器的结果,来自第二个的结果以及两者的差异.
因为两个掩码是相同的,它们的差异(第三个窗格)的结果是一个完整的黑色框架:

然后,突然改变视频源(第二个VideoCapture对象): …
我有背景减法工作得很好.但问题是,它将阴影标记为前景.
有没有人找到一些技术摆脱背景阴影?链接到您已经使用并且可靠的技术,论文,文章等将是非常棒的!
opencv image-processing computer-vision background-subtraction shadow-removal
您知道任何从移动相机中扣除背景的来源吗?我想写一些类似的东西: http: //vimeo.com/72577177
有很多关于静止背景运动检测的材料,但我找不到任何运动背景的代码示例。
编辑:我考虑了光流和通过检测最大数量的相似向量来去除背景。真有这么简单吗?
我正在研究一种跟踪算法,它所做的最早的步骤之一就是背景扣除。该算法获取一系列代表具有移动对象和静态背景的视频的帧。该对象存在于每一帧中。
在这个过程的第一个版本中,我计算了所有帧的中值图像,并获得了非常好的背景场景近似值。然后我从视频序列中的每一帧中减去生成的图像以获得前景(移动物体)。
上面的方法效果很好,但后来我尝试用OpenCV的背景减法器MOG和MOG2来代替它。
我不明白的是这两个类如何执行“后台模型的预计算”?据我从数十个教程和文档中了解到,每次我使用 apply() 方法并返回前景蒙版时,这些减法器都会更新背景模型。
但这意味着 apply() 方法的第一个结果将是一个空白掩码。后面的图像将具有初始对象的位置重影(参见下面的示例):

我缺少什么?我用谷歌搜索了很多,似乎是唯一一个遇到这个问题的人......有没有一种方法可以运行我不知道的后台预计算?
编辑:我发现了一个“技巧”来做到这一点:在使用 OpenCV 的 MOG 或 MOG2 之前,我首先计算中值背景图像,然后在第一次 apply() 调用中使用它。以下 apply() 调用生成没有初始位置重影的前景蒙版。
但是,这是应该这样做还是有更好的方法?
opencv ×9
c++ ×3
android ×1
difference ×1
java ×1
mog ×1
opticalflow ×1
parameters ×1
python ×1
webcam ×1