0

我试图找出2张图像中的差异。场景:假设我有2张图片,一张背景和另一张背景前面的人物,我想以这样一种方式减去两张图片,以获得人物的位置,即该程序是否可以检测到该人站在哪里,并将减去的图像作为输出。OpenCV图像处理

我设法得到的代码是从相机拍摄两张图像并重新调整大小,并将两张图像转换为灰度。在此之后我想知道该怎么做。我检查了OpenCV提供的减法函数,但它将数组作为输入,所以我不知道如何进展。

我写的代码是:

cap>>frame; //gets the first image 
cv::cvtColor(frame,frame,CV_RGB2GRAY); //converts it to gray scale 
cv::resize(frame,frame,Size(30,30)); //re-sizes it 

cap>>frame2;//gets the second image 
cv::cvtColor(frame2,frame2,CV_RGB2GRAY); //converts it to gray scale 
cv::resize(frame2,frame2,Size(30,30)); //re-sizes it 

现在我简单地使用像减函数:

cv::subtract(frame_gray,frame,frame); 

还是我先办理一些过滤器,然后用减函数?

+0

_“它需要数组作为输入,所以我不知道如何进步”_图像的内容不过是一个字节数组,对吗?无论如何,你真的尝试过用'cv :: subtract'做什么吗? – Rook 2012-07-10 10:27:20

+0

不,当我看到文档时,我只是在代码中添加了减法语句作为注释。在减去图像之前,我不需要任何滤镜来处理图像?我是否需要将图像加载到内存中才减去它们?我在某处读过,不知道我是否有必要。 – 2012-07-10 10:32:26

+1

你也许应该搜索关于opencv图像或背景减法的更多信息。例如,一个非常快速的搜索引起[相关的stackoverflow问题](http://stackoverflow.com/questions/9742591/opencv-issue-of-image-subtraction)。看看它是如何在其他地方完成的,并询问是否卡住,而不是在尝试任何事情之前求助于;-) – Rook 2012-07-10 10:39:28

回答

1

正如其他人已经注意到的,这是一个棘手的问题:容易想出一个有时会起作用的黑客,很难想出一个解决方案,将只需最少的人工干预就能在大多数时间工作。而且,如果你能够严格控制背景的材质和照明,就会容易得多。专业应用程序在计算机视觉领域被称为“chromakeying”(尤其是电视行业),“bluescreening”,“matting”或“travelling matte”(电影摄影),“背景消除”。

许多年前由Petro Vlahos完成了用于消光准均匀背景的突破性工作。其基本算法的专利已经过期,所以你可以和他们一起去镇上(并找到各种质量的开源实现)。毋庸赘言,IANAL,您的专利主题也是如此。

消除更复杂的背景仍然是一个活跃的研究领域,特别是在没有3D信息的情况下。您可能需要查看一些研究报告,这些报告是半年前MS Research发布的(A. Criminisi在该领域做了一些工作)。

+0

IANAL?这是什么? – 2012-07-10 13:23:32

+1

你有试过谷歌吗? https://www.google.com/search?q=IANAL – 2012-07-10 14:23:03

+0

另外,你如何做到这一点,链接名称与链接? – 2012-07-10 15:29:00

0

使用减法并不合适,因为它可能会导致一些值变为负值,并且只有在您试图查看是否存在差异(布尔值true/false)时才有效。

如果你需要得到它的不同的像素,你应该通过像素比较做一个像素 - 是这样的:

int rows = frame.rows; 
int cols = frame.cols; 
cv::Mat diffImage = cv::Mat::zeros(rows, cols, CV_8UC1); 
for(int i = 0; i < rows; ++i) 
{ 
    for(int j = 0; j < cols; ++j) 
    { 

     if(frame.at<uchar>(i,j) != frame2.at<uchar>(i,j)) 
      diffImage.at<uchar>(i, j) = 255; 
    } 
} 

现在,您可以显示或保存diffImage。所有不同的像素将是白色的,而相似的将会是黑色的

+0

frame.at()是一个有效的语句吗?我正在使用Visual Studio 2008和opencv 2.3,并引发错误。 – 2012-07-10 10:38:32

+0

对不起!我错过了数据类型。我编辑了该程序以添加数据类型“”。 – go4sri 2012-07-10 10:40:04

+0

OpenCV提供了减法的替代方法,例如'cvAbsDiff'。顺便提一下,如果正在比较的图像是来自实景的相机帧而不是合成生成的,则相同主体的两帧之间像素值相同的机会相当渺茫! – Rook 2012-07-10 10:42:52