2012-07-13 120 views
2

我正试图找出使用Opencv的2张图像之间的差异。代码如下:图像处理 - 2张图像之间的差异

#include "cv.h" 
#include "highgui.h" 
#include <stdio.h> 
#include<iostream> 

int main() 
{ 
char a,b; 
cv::Mat frame; 
cv::Mat frame2; 
VideoCapture cap(0); 
if(!cap.isOpened()) 
{ 
    cout<<"Camera is not connected"<<endl; 
    getchar(); 
    exit(0); 

} 
Mat edges; 
namedWindow("Camera Feed",1); 
cout<<"Ready for background?(y/Y)"<<endl; 
cin>>a; 
if(a=='y'||a=='Y') 
{ 
cap>>frame; 
cv::cvtColor(frame,frame,CV_RGB2GRAY); 
cv::GaussianBlur(frame,frame,cv::Size(3,3),2.00,0,BORDER_DEFAULT); 
} 

cout<<"Ready for foreground?(y/Y)"<<endl; 
cin>>b; 
if(b=='y'||b=='Y') 
{ 
cap>>frame2; 
cv::cvtColor(frame2,frame2,CV_RGB2GRAY); 
cv::GaussianBlur(frame2,frame2,cv::Size(3,3),2.00,0,BORDER_DEFAULT); 
} 

cv::absdiff(frame,frame2,frame); 


imwrite("img_bw.jpg",frame); 

return 0; 
} 

该代码运行良好,但输出并不是完全黑白的,就像我想要的。我哪里错了?

+2

由于您显然是从网络摄像头捕捉图像或某些其他视频源连续帧可能不完全相等。另外,以“前景”和“背景”为两个框架,前景与背景不同似乎是自然的。你能否详细说明你的目标是什么? – AruniRC 2012-07-13 04:12:48

+0

假设背景是墙壁,前景是站在墙前的男人,那么最终的图像应该显示男人是白色的,而其他的背景是黑色的。根据我所读到的,图像之间的差异用白色表示,相同的部分用黑色表示。瞄准那个。 – 2012-07-13 04:17:11

+0

啊好的,这是有道理的。所以你可以链接到你正在获得什么样的图像?一次完美的背景减法不会发生 - 您可以尝试对图像进行形态学操作以减少虚假的白色斑点,根据形状,面积等丢弃小的白色点。 – AruniRC 2012-07-13 04:25:51

回答

1

您输入的代码将输出灰度阴影,对应于两个图像之间各个像素的差异。仅仅因为相机传感器的噪声或可变性,即使在没有改变的元件之间也总会有一些小的差异。如果您需要纯黑色和白色,则需要选择差异显着的阈值,并将低于该阈值的每个像素都转换为0,并将阈值以上的所有内容转换为255.

+0

您可以提供的任何链接或任何代码?我试图用高斯滤波器来减少噪音。为什么这不起作用? – 2012-07-13 04:28:28

+0

@PrakharMohan,对不起,我不熟悉OpenCV。减少噪音与消除噪音并不相同,恐怕这是不可能的 - 噪音并不是差异的唯一来源。 – 2012-07-13 04:30:47

+0

@ MarkRansom-Ok。 – 2012-07-13 04:33:17