2012-07-13 73 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