标签: background-subtraction

如何量化两幅图像之间的差异?

这就是我想做的事情:

我定期用网络摄像头拍照.有点像时间流逝的事情.但是,如果没有真正改变,也就是说,图片几乎看起来一样,我不想存储最新的快照.

我想有一些量化差异的方法,我必须凭经验确定一个阈值.

我在寻求简洁而不是完美.我正在使用python.

python image-comparison image-processing timelapse background-subtraction

169
推荐指数
9
解决办法
16万
查看次数

OpenCV:如何使用createBackgroundSubtractorMOG

我试图通过OpenCV.org这个教程:

http://docs.opencv.org/trunk/doc/tutorials/video/background_subtraction/background_subtraction.html#background-subtraction

MOG指针初始化为

Ptr<BackgroundSubtractor> pMOG; //MOG Background subtractor
Run Code Online (Sandbox Code Playgroud)

在主要情况下,它以下列方式使用:

pMOG = createBackgroundSubtractorMOG();
Run Code Online (Sandbox Code Playgroud)

但是,这会产生以下错误:

    Error: Identifier "createBackgroundSubtractorMOG" is undefined
Run Code Online (Sandbox Code Playgroud)

此外,要更新背景模型时,使用以下命令:

pMOG->apply(frame, fgMaskMOG);
Run Code Online (Sandbox Code Playgroud)

这又会产生以下错误:

    Error: class "cv::BackgroundSubtractor" has no member "apply"
Run Code Online (Sandbox Code Playgroud)

知道可以做些什么吗?提前谢谢了!

这是整个教程代码:

//opencv
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/video/background_segm.hpp>
//C
#include <stdio.h>
//C++
#include <iostream>
#include <sstream>

using namespace cv;
using namespace std;

//global variables
Mat frame; //current frame
Mat fgMaskMOG; //fg mask generated by MOG method
Mat fgMaskMOG2; //fg mask fg mask generated by MOG2 method
Ptr<BackgroundSubtractor> pMOG; //MOG Background subtractor
Ptr<BackgroundSubtractor> …
Run Code Online (Sandbox Code Playgroud)

opencv background-subtraction mog

19
推荐指数
2
解决办法
5万
查看次数

找不到OpenCV2 Python createBackgroundSubtractor模块

我试图在Python中使用cv2.createBackgroundSubtractorMOG2()方法.我在我的Mac和我的Raspberry Pi上都试过了,并且在运行以下代码行时遇到同样的错误:

fgbg = cv2.createBackgroundSubtractorMOG2()
Run Code Online (Sandbox Code Playgroud)

我使用的代码来自https://github.com/abidrahmank/OpenCV2-Python-Tutorials/blob/master/source/py_tutorials/py_video/py_bg_subtraction/py_bg_subtraction.rst

运行此代码时出现以下错误:

fgbg = cv2.createBackgroundSubtractorMOG2()AttributeError:'module'对象没有属性'createBackgroundSubtractorMOG2'

我似乎无法使用任何createBackgroundSubtractor方法.

我一直试图在过去的一天解决这个问题,但我没有在线搜索,因为在Python上对cv2的支持有限.

提前致谢

python opencv background-subtraction

17
推荐指数
4
解决办法
3万
查看次数

如何在OpenCV中使用cv :: BackgroundSubtractorMOG?

我正在使用OpenCV2.2用背景减法的方法实现移动物体检测.我使用高斯混合模型(GMM)方法来模拟背景参考图像.

我通过使用OpenCV2.2中提供的类cv :: BackgroundSubtractorMOG直接获取前景像素(或前景蒙版).这很方便,但是cv :: BackgroundSubtractorMOG返回的前景掩码不如我预期的那么好.此外,似乎cv :: BackgroundSubtractorMOG的性能比OpenCV1.0中提供的C语言中写的GMM方法差.

以下是我在OpenCV2.2中的代码:

cv::BackgroundSubtractorMOG mog;
mog(frame, fgMask, 0.01);
Run Code Online (Sandbox Code Playgroud)

那么,我是否以错误的方式使用该方法?

顺便说一句,cv :: BackgroundSubtractorMOG是否对前景像素执行阴影去除?

非常感谢你.

opencv computer-vision background-subtraction mog shadow-removal

13
推荐指数
2
解决办法
3万
查看次数

Otsu阈值处理深度图像

我试图从kinect获得的深度图像中减去背景.当我学会了什么otsu阈值时,我认为它可以用它.将深度图像转换为灰度,我希望可以应用otsu阈值来对图像进行二值化.

不过我用OpenCV 2.3实现了这个(试图实现),但是徒劳无功.然而,非常意外地将输出图像二值化.我连续进行了阈值处理(即将结果打印到屏幕上以分析每一帧),并发现对于某些帧,阈值被发现为160ish,有时它被发现为0.我不太明白为什么会发生这种情况.可能是由于kinect返回的深度图像中的0的高数量,这对应于无法测量的像素.有没有办法可以告诉算法忽略值为0的像素?或者otsu阈值对我想做的事情不好?

以下是相关代码的一些输出和部分.您可能会注意到第二个屏幕截图看起来可以做一些很好的二值化,但是我希望实现一个能够区分对应于场景中的椅子和背景的像素.

谢谢.

            cv::Mat1s depthcv(depth->getHeight(), depth->getWidth());
            cv::Mat1b depthcv8(depth->getHeight(), depth->getWidth());
            cv::Mat1b depthcv8_th(depth->getHeight(), depth->getWidth());
            depthcv.data =(uchar*) depth->getDepthMetaData().Data();
            depthcv.convertTo(depthcv8,CV_8U,255/5000.f);

            //apply otsu thresholding
            cv::threshold(depthcv8, depthcv8_th, 128, 255, CV_THRESH_BINARY|CV_THRESH_OTSU);
            std::ofstream output;
            output.open("output.txt");
            //output << "M = "<< endl << " "  << depthcv8 << endl << endl;
            cv::imshow("lab",depthcv8_th);
            cv::waitKey(1);
Run Code Online (Sandbox Code Playgroud)

图片1 这第二个截图看起来可以做一些很好的二值化

opencv kinect background-subtraction

13
推荐指数
1
解决办法
6581
查看次数

高斯拉普拉斯:它是如何工作的?(OpenCV的)

有人知道它是如何工作的以及如何使用OpenCV来做到这一点?拉普拉斯算子可以使用OpenCV计算,但结果不是我所期望的.我的意思是我希望图像在背景区域具有近似恒定的对比度,但它是黑色的,边缘是白色的.即使经过高斯滤波器,也会产生很多噪音.我使用高斯滤波器过滤图像然后应用拉普拉斯.我认为我想要的是以不同的方式完成的.

opencv filtering image-processing background-subtraction

12
推荐指数
1
解决办法
1万
查看次数

OpenCV C++/Obj-C:正确的对象检测

作为某种"假期项目",我正在玩OpenCV并想要检测和测量内容.

当前工作流程(早期阶段 - 检测):

  1. 转换为灰度(cv :: cvtColor)
  2. 应用自适应阈值(cv :: adaptiveThreshold)
  3. 应用canny边缘检测(cv :: Canny)
  4. 寻找轮廓(cv :: findContours)

我的结果有点蹩脚,我不确定什么是正确的方向.我已经让cvBlob在我目前的设置下工作(OSX 10.7.2,Xcode 4.2.1)它是一个更好的方法吗?如果是这样,我该如何以正确的方式实施?

或者我首先需要背景扣除?我尝试过,但之后无法找到轮廓

这是我的形象: 图像来衡量

这是我的输出,当我将轮廓绘制回第一张图像时: 产量

UPDATE

我在我的程序中工作,我的输出看起来有点不同......

- (IBAction)processImage:(id)sender
{
    cv::Mat forground = [[_inputView image] CVMat];
    cv::Mat result = [self isolateBackground:forground];
    [_outputView setImage:[NSImage imageWithCVMat:result]];
}

- (cv::Mat)isolateBackground:(cv::Mat &)_image
{
    int rh = 255, rl = 100, gh = 255, gl = 0, bh = 70, bl = 0;
    cv::cvtColor(_image, _image, CV_RGB2HSV_FULL);
    cv::Mat element = getStructuringElement(cv::MORPH_RECT, cv::Size(5, 5));
    cv::Mat bgIsolation;
    cv::inRange(_image, cv::Scalar(bl, gl, rl), …
Run Code Online (Sandbox Code Playgroud)

c++ opencv objective-c background-subtraction

12
推荐指数
1
解决办法
7313
查看次数

OpenCV findContours问题

我有以下代码执行背景减法,然后使用findContours绘制前景对象周围的边界.

// frame - Input frame from a camera.
// output - Output frame to be displayed.
    void process(cv:: Mat &frame, cv:: Mat &output) {

    cv::cvtColor(frame, gray, CV_BGR2GRAY); 

    // initialize background to 1st frame
    if (background.empty())
        gray.convertTo(background, CV_32F);

    // convert background to 8U
    background.convertTo(backImage,CV_8U);

    // compute difference between current image and background
    cv::absdiff(backImage,gray,foreground);

    // apply threshold to foreground image
    cv::threshold(foreground,output,threshold,255,cv::THRESH_BINARY_INV);

    // accumulate background
    cv::accumulateWeighted(gray, background, learningRate, output);

    // Find regions of interest
    std::vector<std::vector<cv::Point> > v; // Detected foreground points

    cv::findContours(output,v,CV_RETR_LIST,CV_CHAIN_APPROX_NONE); …
Run Code Online (Sandbox Code Playgroud)

c++ opencv image-processing background-subtraction

9
推荐指数
1
解决办法
5663
查看次数

使用OpenCV进行有效的背景减法

我想使用OpenCV方法在视频文件中进行背景扣除.现在我可以做背景减法,但问题是我无法在彩色模式下获得输出.减去背景后的所有输出都是以灰度颜色模式进行的:(.我想获取前景的颜色信息,这是减去背景后的结果输出.

我可以用掩蔽技术吗?像我正在考虑的以下程序.

  1. 捕获输入 - InputFrame(RGB)
  2. 处理 InputFrame
  3. 减去背景,存储前景TempFrame(以灰度显示:()
  4. 使用创建掩码 TempFrame
  5. 将创建的蒙版应用于 InputFrame
  6. 获得彩色前景 OutFrame

我很惊讶使用OpenCV进行屏蔽.我只是OpenCV的初学者.请帮助我克服这一点.

提前致谢.

opencv background-subtraction

8
推荐指数
2
解决办法
3万
查看次数

opencv背景减法

我有一个背景场景的图像和前面有物体的同一场景的图像.现在我想用背景减法创建前景中对象的蒙版.两个图像都是RGB.

我已经创建了以下代码:

cv::Mat diff;
diff.create(orgImage.dims, orgImage.size, CV_8UC3);
diff = abs(orgImage-refImage);

cv::Mat mask(diff.rows, diff.cols, CV_8U, cv::Scalar(0,0,0));
//mask = (diff > 10);

for (int j=0; j<diff.rows; j++) {
    // get the address of row j
    //uchar* dataIn= diff.ptr<uchar>(j);
    //uchar* dataOut= mask.ptr<uchar>(j);
    for (int i=0; i<diff.cols; i++) {
        if(diff.at<cv::Vec3b>(j,i)[0] > 30 || diff.at<cv::Vec3b>(j,i)[1] > 30 || diff.at<cv::Vec3b>(j,i)[2] > 30)
            mask.at<uchar>(j,i) = 255;
    }
}
Run Code Online (Sandbox Code Playgroud)

我不知道我这样做是否正确?

opencv background-subtraction

8
推荐指数
1
解决办法
1万
查看次数