2013-06-27 227 views
1

我想找到我的圖像的輪廓,然後我想使用openCV繪製輪廓。我正在使用VS 2012和OpenCV 2.4.5 我寫了關於查找輪廓和繪製輪廓的示例代碼。 卜我是疊可怕錯誤:)對於任何幫助,我可以理解Opencv輪廓錯誤

void MyClass::findContoursAndDraw(cv::Mat image,int b,int g,int r) 
{ 
findContours(image,contours,CV_RETR_LIST,CV_CHAIN_APPROX_SIMPLE); 
for(int i=0;i<contours.size();i++) 
{ 
    int size=cv::contourArea(contours[i]); 
    if(size>500) 
    { 
     printf("%i \n",size); 
     drawContours(originalTemp,contours,i,cv::Scalar(b,g,r),2,8);   
    } 

} 

}

void MyClass::findContoursAndDrawFilled(cv::Mat image,int b,int g,int r) 
{ 
findContours(image,contours,CV_RETR_LIST,CV_CHAIN_APPROX_SIMPLE); 
for(int i=0;i<contours.size();i++) 
{ 
    int size=cv::contourArea(contours[i]); 
    if(size>3000) 
    { 
     printf("%i \n",size); 
     drawContours(originalImg,contours,i,cv::Scalar(b,g,r));  
    } 

} 
} 

我的門檻和其他必要的功能,效果非常好。但我的程序堆積在尋找輪廓和drawcontour功能。說:

Unhandled exception at 0x00B3A52A (opencv_imgproc245d.dll) in OpencvTest.exe: 
0xC0000005: Access violation reading location 0xCDCDCDCD 

回答

1

我有一個類似的問題。但有兩種隱含的情況。

第一個是繪圖的問題,我抄的官方文檔中包含解決辦法:這爲我繪製不同的顏色對於每個輪廓

findContours(src, contours, hierarchy, CV_RETR_CCOMP, 
       CV_CHAIN_APPROX_SIMPLE); 
    // iterate through all the top-level contours, 
    // draw each connected component with its own random color 
    int idx = 0; 
    for(; idx >= 0; idx = hierarchy[idx][0]) 
    { 
     Scalar color(rand()&255, rand()&255, rand()&255); 
     drawContours(dst, contours, idx, color, CV_FILLED, 8, hierarchy); 
    } 


編輯:這個函數「drawContours」可以繪製輪廓和所有孩子的顏色。爲了更好地理解這一點,請閱讀this


第二個是在輪廓迭代導航。對於一些不知道的原因,來自「findContours(...)」函數的輸出「等值線」會帶來0大小或非常高大小的輪廓(這就像內存抖動,非常大的數字)。我解決辦法我使用條件使用輪廓:

for(int i=0;i<contours.size();i++) 
    { 
    if(contours[i].size() < 10000 && contours[i].size() > 0) 
     { 
     int size=cv::contourArea(contours[i]); 
     if(size>3000) 
      { 
     printf("%i \n",size); 
     drawContours(originalImg,contours,i,cv::Scalar(b,g,r));  
      } 
     } 
    } 

我使用的條件 「如果(輪廓[I] .size() &輪廓[I] .size()> 0)」因爲在任何情況下,當我們操縱「輪廓[i]」,其中「輪廓[i] .size()」爲0或那個大數字時,程序會崩潰。 (即「10000」是任意的,並在我的情況下工作)。