2011-09-21 4 views
2

cvblob을 사용하여 객체를 감지하려고합니다. 그래서 cvRenderBlob() 메서드를 사용합니다. 프로그램이 성공적으로 컴파일되었지만 런타임에 처리되지 않은 예외가 반환됩니다. 내가 그것을 깰 때, cvRenderBlob()cvblob.cpp 파일의 메소드 정의에있는 CvLabel *labels = (CvLabel *)imgLabel->imageData + imgLabel_offset + (blob->miny * stepLbl); 문에 화살표가 표시됩니다. 하지만 cvRenderBlobs() 메서드를 사용하면 문제가 없습니다. 나는 가장 큰 하나의 얼룩을 탐지 할 필요가있다. 어떤 사람은이 예외를 처리하도록 도와주세요. 여기 내 VC++ 코드는,OpenCV cvblob - 렌더링 블롭

CvCapture* capture = 0; 
IplImage* frame = 0; 
int key = 0; 
CvBlobs blobs; 
CvBlob *blob; 

capture = cvCaptureFromCAM(0); 

if (!capture) { 
    printf("Could not initialize capturing....\n"); 
    return 1; 
} 

int screenx = GetSystemMetrics(SM_CXSCREEN); 
int screeny = GetSystemMetrics(SM_CYSCREEN); 

while (key!='q') { 
    frame = cvQueryFrame(capture); 
    if (!frame) break; 

    IplImage* imgHSV = cvCreateImage(cvGetSize(frame), 8, 3); 
    cvCvtColor(frame, imgHSV, CV_BGR2HSV); 

    IplImage* imgThreshed = cvCreateImage(cvGetSize(frame), 8, 1); 
    cvInRangeS(imgHSV, cvScalar(61, 156, 205),cvScalar(161, 256, 305), imgThreshed); // for light blue color 

    IplImage* imgThresh = imgThreshed; 
    cvSmooth(imgThresh, imgThresh, CV_GAUSSIAN, 9, 9); 

    cvNamedWindow("Thresh"); 
    cvShowImage("Thresh", imgThresh); 
    IplImage* labelImg = cvCreateImage(cvGetSize(imgHSV), IPL_DEPTH_LABEL, 1); 
    unsigned int result = cvLabel(imgThresh, labelImg, blobs); 

    blob = blobs[cvGreaterBlob(blobs)]; 
    cvRenderBlob(labelImg, blob, frame, frame); 
    /*cvRenderBlobs(labelImg, blobs, frame, frame);*/ 
    /*cvFilterByArea(blobs, 60, 500);*/ 
    cvFilterByLabel(blobs, cvGreaterBlob(blobs)); 

    cvNamedWindow("Video"); 
    cvShowImage("Video", frame); 
    key = cvWaitKey(1); 
} 

cvDestroyWindow("Thresh"); 
cvDestroyWindow("Video"); 
cvReleaseCapture(&capture); 

답변

1

첫째, 당신이 실제로 일반 C 구문을 사용하고 있음을 지적하고 싶습니다이다. C++은 Mat 클래스를 사용합니다. 나는 그림에서 녹색 물체를 기반으로 한 얼룩 추출에 대해 연구 해왔다. 일단 임계 값이 적절하게 설정되면, "바이너리"이미지, 백그라운드/포 그라운드가 있음을 의미합니다. 나는 구조 분석에 documentation에 더 명확하게

findContours() //this function expects quite a bit, read documentation 

설명하겠다을 사용합니다. 그것은 당신에게 이미지의 모든 얼룩의 윤곽을 줄 것입니다. 이미지의 포인트를 처리하는 다른 벡터를 처리하는 벡터; 같은

vector<vector<Point>> contours; 

너무 큰 덩어리를 찾을 필요, 나의 접근 방식은 일부 확장에 결함이있을 수 있지만, 나는 다른 것 필요하지 않습니다. 나는 그런 다음 RECT

int sizeOfObject = 0; 
int idxBiggestObject = 0; //will track the biggest object 

if(contours.size() != 0) //only runs code if there is any blobs/contours in the image 
{ 
    for (int i = 0; i < contours.size(); i++) // runs i times where i is the amount of "blobs" in the image. 
    { 
     myVector = minAreaRect(contours[i]) 
     if(myVector.size.area > sizeOfObject) 
     { 
      sizeOfObject = myVector.size.area; //saves area to compare with further blobs 
      idxBiggestObject = i; //saves index, so you know which is biggest, alternatively, .push_back into another vector 
     } 
    } 
} 

그래서 그래, 우리가 정말만을 측정 회전 된 경계 상자의 크기에 액세스도 구조 분석 에서

minAreaRect() // expects a set of points (contained by the vector or mat classes 

설명하겠다

를 사용하지만, 대부분의 경우에 할 것입니다. C++ 구문으로 전환하거나 기본 알고리즘에서 영감을 얻기를 바랍니다.

즐기십시오.