2012-07-13 48 views
0

下面给出的是我用来查找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(51,51),2.00,0,BORDER_DEFAULT); 
} 
cv::waitKey(5000); 
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(51,51),2.00,0,BORDER_DEFAULT); 
} 
cv::Mat frame3; 
cv::absdiff(frame,frame2,frame3); 


imwrite("img_bw.jpg",frame3); 

return 0; 
} 

输出结果类似于this。 我想知道是否有任何方法可以画出像身体轮廓的东西。谢谢。

+0

是不是你的脸部分有点暗? – 2012-07-13 05:23:03

+0

是的,我认为这是因为背景中的玻璃。它不正确? – 2012-07-13 05:27:15

+0

什么玻璃?镜子?是背景减法的结果吗? – 2012-07-13 05:29:12

回答

1

我只是尝试了以下方法。

首先扩大灰度图像,然后对图像应用自适应阈值。

后来发现图像中的轮廓,并假定您的身体将是图像中最大的斑点,为最大的斑点绘制轮廓。

import cv2 
import numpy as np 

img = cv2.imread('sofqn.jpg') 
gray = cv2.imread('sofqn.jpg',0) 

kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(10,10)) 
gray = cv2.dilate(gray,kernel) 

thresh = cv2.adaptiveThreshold(gray,255,0,1,11,2) 

cont,hier = cv2.findContours(thresh,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE) 
max_area = -1 
best_cnt = None 
for cnt in cont: 
    area = cv2.contourArea(cnt) 
    if area > max_area: 
     max_area = area 
     best_cnt = cnt 

cv2.drawContours(img,[best_cnt],0,[0,255,0],2) 

下面是结果:

enter image description here

+0

W-O-W!谢谢!!你知道我怎样才能改善我的计划的结果吗?那就是如何区分2张图像,以便输出完全黑白?再次感谢!! – 2012-07-13 05:45:29

+0

我没有现成的答案,如果你可以分享两个图像的链接,我可以试一试。 – 2012-07-13 05:50:27

+0

就像我的情况一样,一个背景的图像和另一个背景前的人的图像。我得到的图像来自我的摄像头。 – 2012-07-13 05:54:27