1

画像の輪郭を見つけたいので、openCV を使用して輪郭を描画します。私はVS 2012とOpenCV 2.4.5を使用しています。輪郭の検索と輪郭の描画に関するサンプルコードを書きました。Bu私はその恐ろしいエラーを積み上げました:)どんな助けにも感謝します

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
4

1 に答える 1

1

同様の問題がありました。しかし、暗黙の状況が 2 つあります。

最初のものは、解決するために公式ドキュメントに含まれている方法をコピーした描画の問題です。

    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」は、輪郭とすべての子の色を描画できます。これをよりよく理解するには、これを読んでください


2 つ目は、等高線の反復ナビゲーションです。なんらかの理由で、「findContours(...)」関数からの出力「contours」は、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));     
          }
       }
    }

「if(contours[i].size() < 10000 && 輪郭[i].size() > 0)」という条件を使用しました。 i].size()" が 0 またはその大きな数値の場合、プログラムはクラッシュします。(その「10000」は任意であり、私の場合は機能しました)。

于 2013-07-14T06:58:28.757 に答える