2

みなさん、こんにちは。ご清聴ありがとうございました。次の問題があります。

画像にいくつかの座標vector<Point>を保存するがあります。したい:

  1. タイプCV_8Uの空白の白いマットを作成します
  2. 座標ベクトルの各ポイントについて、そのポイントを白い画像の上に黒でマークしたいと思います。
  3. 画像を印刷します。

ベクトルを反復処理する関数は次のとおりです

void Frag::updateImage(vector<Point> points){

    ...

    if(NewHeight > 0 && NewWidth > 0){

        cv::Mat NewImage = cv::Mat(NewHeight, NewWidth, CV_8U, Scalar(255));
        // Is this the correct way to initialize a blank Mat of type CV_8U???

        for (unsigned int i = 0; i < points.size(); i++) {

            uchar* PointPtr = NewImage.ptr<uchar> (points[i].x, points[i].y);
            *PointPtr = 0;
        }

        Utility::DisplayImage(NewImage);

    }

    ...

 }

そして、これが私の印刷機能です:

void Utility::DisplayImage(Mat& tgtImage) {

    namedWindow("Draw Image", (CV_WINDOW_NORMAL | CV_WINDOW_KEEPRATIO));
    imshow("Draw Image", tgtImage);
    waitKey(0);

}

私の問題は次のとおりです。値がマトリックスに保存されているように見えますが(印刷してみました)、DisplayImage関数(他のすべての場合は正常に機能します)は空白の白い画像だけを表示し続けます。

私は何が欠けていますか?ポインタ関連の問題?マットの初期化の問題?

<--- --- --- UPDATE --- --- --->

最初の回答の後、実際の問題はマットに値を設定できないことであることがわかりました。マット内のすべての値を出力するための単純なループを追加したため(私のマットは非常に小さいことが多いため)、私はそれを見つけました。ループは次のとおりです(座標のベクトルに対する反復の直後に配置します:

for(int j = 0; j< NewHeight; j++){
    for(int i = 0; i< NewWidth; i++){
        Logger << (int)NewImage.at<uchar> (i, j) << " ";
    }
    Logger << endl;
}

そしてその結果は常にこれです:

Creating image with W=2, H=7.
255 255 
255 255 
255 255 
255 255 
255 255 
255 255 
255 255 

それで、値は設定されていないだけです、何か考えはありますか?

画像の種類(CV_8U)に関係があるのでしょうか?

4

3 に答える 3

1

まだテストされていませんが、これがお役に立てば幸いです。

Mat NewImage = Mat(NewHeight, NewWidth, CV_8U, Scalar(255));

for(int j = 0; j< NewHeight; j++){
for(int i = 0; i< NewWidth; i++){

for (int k = 0; k < points.size(); k++) {

            if(i==points[k].x && j ==points[k].y)
               NewImage.at<uchar>(j,i) = 0;
        }

}        
}
imshow(NewImage);
于 2013-01-30T22:01:27.660 に答える
1

代わりに次のことができます。

for (int i =0; i < points.size(); i++)
{
    cv::circle(NewImage, points.at(i), 0, cv::Scalar(0));    //The radius of 0 indicates a single pixel
}

これにより、データへの直接アクセスやポインタ操作が不要になり、はるかに読みやすくなります。

于 2013-01-30T22:51:55.473 に答える
1

コードを徹底的に分析した後、ベクトルに格納されている座標が、より大きなMat、たとえばMatに関連していることを検出しましたOldImage マットNewImageは、ポイントオブマットOldImageNewImageOldImageよりもはるかに小さい)のサブセットを格納することを目的としていましたが、ある座標系から別の座標系への座標変換がないため、常に間違った位置に書き込んでいました。

単純な減算を使用してポイントを正しい座標系に変換することで、問題を解決しました。

于 2013-01-31T10:11:16.530 に答える