2012-04-28 2 views
0

저는 프레임 차이 (absdiff, 임계 값, 침식 등) 사이의 움직임을 감지하기 위해 프레임 차이와 opencv를 사용하고 있습니다.opencv를 사용하여 검정색 배경에있는 흰색 물체를 감지합니다.

기본적으로 흰색 얼룩의 움직임 (rect : x, y, 너비, 높이)의 개별 좌표의 좌표는 어떻게 얻을 수 있습니까?

+0

먼저'cvFindContour'를 사용할 수 있습니다. 그런 다음'cvBoundingRect'를 사용하여 주위를 정.합니다. –

답변

2

나는 똑같은 일을하고 있습니다. 여기에 내가 가지고있는 코드가 있습니다. (다른 클래스로 처리되는 것들도 있습니다. 첫 번째 부분은 이미 가지고있는 부분이며, 윤곽 부분으로 건너 뜁니다.

/* This is the background subtraction you already have */ 
Mat tmp1; 
GaussianBlur(frame, tmp1, Size(5,5),0,0); //Blurring one image is sufficient to eliminate noise 
absdiff(tmp1, frameLast, tmp1); 
cvtColor(tmp1,tmp1,CV_RGB2GRAY); 
threshold(tmp1, tmp1, CV_THRESH_OTSU, 100, CV_THRESH_BINARY); 
/*cleaning up */ 
int erosion_type = MORPH_RECT; // MORPH_RECT, MORPH_CROSS, MORPH_ELLIPSE 
int erosion_size = 3; 
Mat erosion_element = getStructuringElement(erosion_type, Size(2*erosion_size + 1, 2*erosion_size+1), Point(erosion_size, erosion_size)); 

int dilation_type = MORPH_RECT; 
int dilation_size = 5; 
Mat dilation_element = getStructuringElement(dilation_type, Size(2*dilation_size + 1, 2*dilation_size+1), Point(dilation_size, dilation_size)); 

erode(tmp1,tmp1,erosion_element); 
dilate(tmp1,tmp1,dilation_element); 

/* Here I am getting the contours */ 
vector<vector<Point> > contours; 
findContours(tmp1, contours, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE); 
int minArea = 100, maxArea = 1000; //keep only contours of a certain size 
for (vector<vector<Point> >::iterator it=contours.end(); it!=contours.begin(); it--) { 
    if ((*it).size()<minArea || (*it).size()>maxArea) { 
     contours.erase(it); 
    } 
} 

drawContours(displayer, contours, a, Scalar(122,200,222),2); 

더 자세한 내용은 here 참조 (당신은 당신이 무엇을 발견 좁힐 수, 찾을 등고선하는, 특히 옵션을. 난 그냥 CV_RETR_EXTERNAL를 사용).

매트 디스플레이 어는 frame.copyTo (displayer)로 복사 한 프레임의 딥 복사입니다.이 것은 프레임에 직접 물건을 그릴 때 이동하기 때문입니다. "frameLast"및 다음 absDiff 팝업. 물론 당신이 완전히 프레임에서 그림을 그리기 전에 프레임을 복사하여 (이렇게 모든 끝에 그리기)이 여분의 이미지를 피할 수, 나는 쉽게 코드의 아무 데서 나에서 그릴 수 있으므로, 많은 일을 시도하고 때때로 중간 단계를 볼 수 있기를 원하기 때문에 지금은 더 쉬워집니다.

+0

윤곽선 크기()가 영역이 아닙니다. 그것은 윤곽의 점의 수입니다. – kelin

0

기본적으로 cvBlobsLib을 사용해 볼 수도 있습니다. 그것을 다루기가 힘듭니다. 나중에 익숙해지면 사용하기가 아주 쉽습니다. 이미지에서 흰색 얼룩을 발견합니다. 그 반대. 다음 경계 상자를 사용할 수 있습니다. 거기에서 당신은 포인트 위치를 얻을 수 있습니다.

관련 문제