지금 작업하고있는 프로그램은 입니다. 거의 일이지만 결과는별로 만족스럽지 않습니다. Canny 알고리즘을 사용하여 객체의 컨투어를 매우 명확하게 파악할 수 있었지만 프로그램은 컨투어를 인식하고 빨간색 선으로 컨투어를 그리는 데 약간의 문제가있었습니다. 프로그램 :C++ FindContours를 사용하여 비디오 이미지의 컨투어를 찾는 데 문제가 있습니다.
void setwindowSettings(){
namedWindow("Contours", CV_WINDOW_AUTOSIZE);
createTrackbar("LowerC", "Contours", &lowerC, 255, NULL);
createTrackbar("UpperC", "Contours", &upperC, 255, NULL);
}
void wait(void)
{
long t=30000000;
while(t--);
}
int main(void)
{
VideoCapture cap(0); // open the default camera
if(!cap.isOpened()) // check if we succeeded
return -1;
Mat frame,foreground,image;
double pt1, pt2, area;
Rect rect;
int i;
vector<vector<Point> > contours;
vector<vector<Point> > largest_contours;
namedWindow("Capture", CV_WINDOW_AUTOSIZE);
setwindowSettings();
while(1){
cap >> frame; // get a new frame from camera
if(frame.empty())
break;
image=frame.clone();
cvtColor(image,foreground,CV_BGR2GRAY);
GaussianBlur(foreground,foreground,Size(9,11),0,0);
Canny(foreground,foreground,lowerC,upperC,3);
findContours(foreground,contours,CV_RETR_EXTERNAL,CV_CHAIN_APPROX_SIMPLE);
if(contours.empty())
continue;
double largest_area = 0;
for(i= 0; i < contours.size(); i++){ // get the largest contour
area = fabs(contourArea(contours[i]));
if(area >= largest_area){
largest_area = area;
largest_contours.clear();
largest_contours.push_back(contours[i]);
}
}
if(largest_area>=3000){ // draw the largest contour if exceeded minimum largest area
drawContours(image,largest_contours,-1,Scalar(0,0,255),2);
printf("area = %.f\n",largest_area);
}
wait();
imshow("Capture",image);
imshow("Contours",foreground);
if(waitKey(30) >= 0) break;
}
// the camera will be deinitialized automatically in VideoCapture destructor
return 0;
}
프로그램 요약 :
- 소음 여과 카메라에서 이미지 가져 오기 (변환이 회색 → 흐림 → 영리한)
- 최대 규모의 윤곽을 찾기 윤곽을
- 를 찾아 이미지의 해당 영역 일명 개체
- 개체 주위에 빨간색 선을 그리고 가장 큰 영역을 인쇄하십시오.
- 린스와
를 반복하고 결과 :
은 거의 내가 원하는 것을 얻지 않았다; 그린 윤곽선 검출, 레드 라인 (좋은) :
... 보통 나는이있어; 어떤 윤곽 검출되지 레드 라인 (ONE BAD는) :
확률은 좋은에 대한 1/20
아주 좋은하지 않은 있습니다 얻을 수 없습니다. 또한 객체 주위에 빨간색 선이 나타나면 Contours
의 객체 윤곽 선이 깜박입니다 (GOOD ONE 그림 참조). 이 질문에 내 물건 (검은 색 작은 정사각형 상자) 중 하나를 사용하고 있지만이 물건 감지 프로그램의 주된 목적은 모양이나 색깔에 관계없이 대상물을 감지하기 위해 입니다.
그래서 내 질문은 : 나는 아직도 윤곽에도 불구하고 나쁜 것들을 얻을 왜
- 이 일만큼 명확하다?
- 누구나 윤곽 검출을 개선하는 방법에 대해 더 좋은 아이디어를 공유 할 수 있습니까? (즉, 블러 알고리즘이 더 좋음)
-
빨간색 선이 물체 주위로 그려지면 윤곽선이 깜박 거리는 것을 방지하려면 어떻게해야합니까?
편집 : 난 그냥 깜박 윤곽의 선이 그것 때문에 주위에 표시된 빨간 선이 아닌 것을 발견 (중 drawContours
또는 line
기능)하지만 가장 큰 윤곽이 findContours
기능에 의해 감지 계산됩니까 후 가장 큰 윤곽으로
에 대한 질문입니다. 3 HERE을 클릭하십시오.VIDEO HERE, CLICK IT!!!
미리 감사드립니다.
추신 : 저는 Ms Visual C++ 2010 Exp에서 OpenCV 2.4.3을 사용하고 있습니다. 당신이 그렇게 큰 윤곽 난 당신이 camera.I의 시야에 나타나는 가장 큰 물체를 탐지하려고하는 가정 왜 오른쪽 상단에있는 창이 빛/밝은 광원 아무튼 궁금 사실을 사용하고 있기 때문에
문제를 일으키는이 비디오의 적어도 일부를 기입하십시오보십시오. 귀하의 다른 질문에 댓글이 http://stackoverflow.com/questions/14750464/blinking-contour-line, 거기에 당신이 함께 작업하는 실제 데이터가없는 솔루션을 추측하려고 많은 점입니다. – mmgp
비디오가 추가되었습니다. http://www.youtube.com/watch?v=4GLabxxd228&feature=youtu.be –
이것은 실행중인 응용 프로그램의 비디오이므로 필요하지 않습니다. 필요한 것은 창 녹음 등을하지 않고 원래 기록 된 프레임 만 처리하면됩니다. 이를 위해'VideoWriter'를 사용하십시오. – mmgp