2

だから私はバイナリマトリックスを浸食しようとしています。このコードを使用してマトリックスを作成します。

cv::Mat tmp = cv::Mat::zeros( IMG->width, IMG->height, CV_8U );

for( auto i = 0 ; i < IMG->width ; i++)
{
    for ( auto j = 0 ; j < IMG->height ; j++)
    {
        if(  cv::pointPolygonTest(cv::Mat(contour),cv::Point(i,j),true) < 0 )
        {
            tmp.at<double>(i,j) = 255;
        }
    }

}   

使用しているソース画像は次のとおりです。

http://snag.gy/ZZzhw.jpg

そして、これは私のループで得られるものです(これは tmp マトリックスです):

http://snag.gy/lhuR7.jpg

したがって、このコードを使用して画像を侵食しようとした後:

int erosion_elem = 1;
int erosion_size = 8;


int erosion_type;
if( erosion_elem == 0 ){ erosion_type = MORPH_RECT; }
else if( erosion_elem == 1 ){ erosion_type = MORPH_CROSS; }
else if( erosion_elem == 2) { erosion_type = MORPH_ELLIPSE; }

Mat element = getStructuringElement( erosion_type,
                                   Size( 2*erosion_size + 1, 2*erosion_size+1 ),
                                   Point( erosion_size, erosion_size ) );

/// Apply the erosion operation
erode( binary, erosion_dst, element );`

したがって、うまくコンパイルされますが、次の行で例外が発生します。

erode( binary, erosion_dst, element );`

サポートされていないデータ型であると表示されます。なぜこの例外が発生するのか、誰にも分かりますか?

マトリックス tmp のデータ型を変更しようとしましたが、同じエラーが発生しました。

ご協力いただきありがとうございます !

4

1 に答える 1

2

バイナリ イメージのピクセルはunsigned char(CV_8U -> 8 ビット -> 1 バイト) として保存されます。ピクセルの値unsigned charも保存する必要があります。

cv::Mat tmp = cv::Mat::zeros( IMG->width, IMG->height, CV_8U );

for( auto i = 0 ; i < IMG->width ; i++)
{
    for ( auto j = 0 ; j < IMG->height ; j++)
    {
        if(  cv::pointPolygonTest(cv::Mat(contour),cv::Point(i,j),true) < 0 )
        {
            tmp.at<unsigned char>(i,j) = 255;
        }
    }

}

(コメントから回答を作成)

于 2013-06-13T11:01:21.917 に答える