1

バイナリ イメージを使用したいfindContoursのですが、コールバック関数でエラーが発生します。

RtlFreeHeap に無効なアドレスが指定されました

戻るとき。

clear()値を解放するために使用したい場合vector<vector<Point> >、同じ例外が発生し、free.c の次の行でコードがクラッシュしました。

if (retval == 0) errno = _get_errno_from_oserr(GetLastError());

例えば:

void onChangeContourMode(int, void *)
{
    Mat m_frB = imread("3.jpg", 0);
    vector<vector<Point>> contours
    vector<Vec4i> hierarchy;
    findContours(m_frB, contours, hierarchy, g_contour_mode, CV_CHAIN_APPROX_SIMPLE);
    for( int idx = 0 ; idx >= 0; idx = hierarchy[idx][0] )
    drawContours( m_frB, contours, idx, Scalar(255,255,255), 
    CV_FILLED, 8, hierarchy );
    imshow( "Contours", m_frB );
}

誰でも私を助けることができますか?どうもありがとうございました!

4

1 に答える 1

1
Mat m_frB = imread("3.jpg", CV_LOAD_IMAGE_GRAYSCALE);

8bppグレースケール画像として読み込ま3.jpgれるため、バイナリ画像ではありません。「ゼロ以外のピクセルは1として扱われます。ゼロピクセルは0のままなので、画像はバイナリとして扱われます」findContoursという機能に固有です。また、この「輪郭を抽出しながら画像を変更する機能」にも注意してください。

ここでの実際の問題は、宛先画像が8bppですが、CV_8UC3RGB等高線を描画する前に、を使用して3つのチャネルがあることを確認する必要があることです。これを試して:

// find contours:
vector<vector<Point> > contours;
vector<Vec4i> hierarchy;
findContours(m_frB, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE);

// draw contours:
Mat imgWithContours = Mat::zeros(m_frB.rows, m_frB.cols, CV_8UC3);
RNG rng(12345);
for (int i = 0; i < contours.size(); i++)
{
    Scalar color = Scalar(rng.uniform(50, 255), rng.uniform(50,255), rng.uniform(50,255));
    drawContours(imgWithContours, contours, i, color, 1, 8, hierarchy, 0);
}
imshow("Contours", imgWithContours);
于 2013-03-14T10:41:44.673 に答える