みなさん、こんにちは。ご清聴ありがとうございました。次の問題があります。
画像にいくつかの座標vector<Point>
を保存するがあります。したい:
- タイプCV_8Uの空白の白いマットを作成します
- 座標ベクトルの各ポイントについて、そのポイントを白い画像の上に黒でマークしたいと思います。
- 画像を印刷します。
ベクトルを反復処理する関数は次のとおりです。
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)に関係があるのでしょうか?