这就是我想做的事情:
我定期用网络摄像头拍照.有点像时间流逝的事情.但是,如果没有真正改变,也就是说,图片几乎看起来一样,我不想存储最新的快照.
我想有一些量化差异的方法,我必须凭经验确定一个阈值.
我在寻求简洁而不是完美.我正在使用python.
python image-comparison image-processing timelapse background-subtraction
我试图通过OpenCV.org这个教程:
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) 我试图在Python中使用cv2.createBackgroundSubtractorMOG2()方法.我在我的Mac和我的Raspberry Pi上都试过了,并且在运行以下代码行时遇到同样的错误:
fgbg = cv2.createBackgroundSubtractorMOG2()
Run Code Online (Sandbox Code Playgroud)
运行此代码时出现以下错误:
fgbg = cv2.createBackgroundSubtractorMOG2()AttributeError:'module'对象没有属性'createBackgroundSubtractorMOG2'
我似乎无法使用任何createBackgroundSubtractor方法.
我一直试图在过去的一天解决这个问题,但我没有在线搜索,因为在Python上对cv2的支持有限.
提前致谢
我正在使用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
我试图从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)
有人知道它是如何工作的以及如何使用OpenCV来做到这一点?拉普拉斯算子可以使用OpenCV计算,但结果不是我所期望的.我的意思是我希望图像在背景区域具有近似恒定的对比度,但它是黑色的,边缘是白色的.即使经过高斯滤波器,也会产生很多噪音.我使用高斯滤波器过滤图像然后应用拉普拉斯.我认为我想要的是以不同的方式完成的.
作为某种"假期项目",我正在玩OpenCV并想要检测和测量内容.
当前工作流程(早期阶段 - 检测):
我的结果有点蹩脚,我不确定什么是正确的方向.我已经让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) 我有以下代码执行背景减法,然后使用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) 我想使用OpenCV方法在视频文件中进行背景扣除.现在我可以做背景减法,但问题是我无法在彩色模式下获得输出.减去背景后的所有输出都是以灰度颜色模式进行的:(.我想获取前景的颜色信息,这是减去背景后的结果输出.
我可以用掩蔽技术吗?像我正在考虑的以下程序.
InputFrame
(RGB)InputFrame
TempFrame
(以灰度显示:()TempFrame
InputFrame
OutFrame
我很惊讶使用OpenCV进行屏蔽.我只是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)
我不知道我这样做是否正确?