2013-02-05 3 views
2

지금 작업하고있는 프로그램은 입니다. 거의 일이지만 결과는별로 만족스럽지 않습니다. 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; 
} 

프로그램 요약 :

  1. 소음 여과 카메라에서 이미지 가져 오기 (변환이 회색 → 흐림 → 영리한)
  2. 최대 규모의 윤곽을 찾기 윤곽을
  3. 를 찾아 이미지의 해당 영역 일명 개체
  4. 개체 주위에 빨간색 선을 그리고 가장 큰 영역을 인쇄하십시오.
  5. 린스와

를 반복하고 결과 :

은 거의 내가 원하는 것을 얻지 않았다; 그린 윤곽선 검출, 레드 라인 (좋은) :

Contours detected. Noted that half the contour line disappears

... 보통 나는이있어; 어떤 윤곽 검출되지 레드 라인 (ONE BAD는) :

No contour detected, although there is a contour

확률은 좋은에 대한 1/20 아주 좋은하지 않은 있습니다 얻을 수 없습니다. 또한 객체 주위에 빨간색 선이 나타나면 Contours의 객체 윤곽 선이 깜박입니다 (GOOD ONE 그림 참조). 이 질문에 내 물건 (검은 색 작은 정사각형 상자) 중 하나를 사용하고 있지만이 물건 감지 프로그램의 주된 목적은 모양이나 색깔에 관계없이 대상물을 감지하기 위해 입니다.

그래서 내 질문은 : 나는 아직도 윤곽에도 불구하고 나쁜 것들을 얻을 왜

  1. 이 일만큼 명확하다?
  2. 누구나 윤곽 검출을 개선하는 방법에 대해 더 좋은 아이디어를 공유 할 수 있습니까? (즉, 블러 알고리즘이 더 좋음)
  3. 빨간색 선이 물체 주위로 그려지면 윤곽선이 깜박 거리는 것을 방지하려면 어떻게해야합니까?

편집 : 난 그냥 깜박 윤곽의 선이 그것 때문에 주위에 표시된 빨간 선이 아닌 것을 발견 (중 drawContours 또는 line 기능)하지만 가장 큰 윤곽이 findContours 기능에 의해 감지 계산됩니까 후 가장 큰 윤곽으로

에 대한 질문입니다. 3 HERE을 클릭하십시오.VIDEO HERE, CLICK IT!!!

미리 감사드립니다.

추신 : 저는 Ms Visual C++ 2010 Exp에서 OpenCV 2.4.3을 사용하고 있습니다. 당신이 그렇게 큰 윤곽 난 당신이 camera.I의 시야에 나타나는 가장 큰 물체를 탐지하려고하는 가정 왜 오른쪽 상단에있는 창이 빛/밝은 광원 아무튼 궁금 사실을 사용하고 있기 때문에

+0

문제를 일으키는이 비디오의 적어도 일부를 기입하십시오보십시오. 귀하의 다른 질문에 댓글이 http://stackoverflow.com/questions/14750464/blinking-contour-line, 거기에 당신이 함께 작업하는 실제 데이터가없는 솔루션을 추측하려고 많은 점입니다. – mmgp

+0

비디오가 추가되었습니다. http://www.youtube.com/watch?v=4GLabxxd228&feature=youtu.be –

+0

이것은 실행중인 응용 프로그램의 비디오이므로 필요하지 않습니다. 필요한 것은 창 녹음 등을하지 않고 원래 기록 된 프레임 만 처리하면됩니다. 이를 위해'VideoWriter'를 사용하십시오. – mmgp

답변

1
  1. 어떤 윤곽선도 생기지 않습니다 (흐리게 표시 될 수 있음). 배경 이미지를 저장하고 오브젝트가 나타나는 이미지에서 뺄 수 있습니다. 이렇게하면 오브젝트를 파생시킬 수 있습니다. 차이 이미지에서 등고선 찾기를 적용 할 수 있습니다. absdiff(frame_now,frame_backgrnd,diff) 여기서 diff은 차이 이미지입니다.
  2. 물체가 움직이고 탐지하고자하는 경우 가장 큰 윤곽선과 결합 된 광학 흐름을 사용하여 물체를 감지 할 수 있습니다.
  3. 흐림 기능없이 처리하고 가장 큰 contourArea를 감지 해보십시오. 포인트를 플로팅
  4. for(int i = 1;i<(int)largest_contours[0].size();i++) 
        line(image,largest_contours[0][i-1],largest_contours[0][i],cv::Scalar(0,0,255),2,8,0); 
    
+0

제안 해 주셔서 감사합니다. 나는 이미 no.1과 no.4를 테스트했지만 동일한 결과를 얻었습니다. 빨간색 선이 그려지면 컨투어 선이 계속 깜박이며 가장 큰 윤곽 검출에는 큰 변화가 없습니다. no.3에서는 blur 함수없이'findContours' 함수를 사용하면 윤곽 검출이 최악이되는 것처럼 보입니다. 나는 안된다. 3 그러나 그 물체는 항상 움직이지 않아서 나는 그것이 내 프로그램에 잘 적용될 것이라고 생각하지 않는다. –

+0

동전이 거의없는 크기의 작은 물건이 있다고합시다. 손에 넣고 카메라 앞에 가져다 놓으세요. 동전이나 손의 외곽선만을 찾으려고합니까? 또한? –

관련 문제