12

OpenCVで 1 チャネル (例: CV_8UC1) の Mat オブジェクトを操作する場合、すべてが 1 の Mat が作成されますcv::Mat img = cv::Mat::ones(x,y,CV_8UC1)

ただし、3 チャンネルの画像 (例: CV_8UC3) を使用すると、状況が少し複雑になります。実行するとcv::Mat img = cv::Mat::ones(x,y,CV_8UC3)チャネル0に 1 が入りますが、チャネル 1 と 2 にはゼロが含まれます。では、マルチチャンネル画像にはどのように使用すればよいでしょうか?cv::Mat::ones()

ここに、私が何を意味するかを理解するのに役立つコードをいくつか示します。

void testOnes() {
 int x=2; int y=2; //arbitrary

 // 1 channel
 cv::Mat img_C1 = cv::Mat::ones(x,y,CV_8UC1);
 uchar px1 = img_C1.at<uchar>(0,0); //not sure of correct data type for px in 1-channel img
 printf("px of 1-channel img: %d \n", (int)px1); //prints 1

 // 3 channels
 cv::Mat img_C3 = cv::Mat::ones(x,y,CV_8UC3); //note 8UC3 instead of 8UC1
 cv::Vec3b px3 = img_C3.at<cv::Vec3b>(0,0);
 printf("px of 3-channel img: %d %d %d \n", (int)px3[0], (int)px3[1], (int)px3[2]); //prints 1 0 0
}

したがって、この出力が表示されることを期待していました:px of 3-channel img: 1 1 1が、代わりに次のように表示されます: px of 3-channel img: 1 0 0

PS私はこれを投稿する前に多くの検索を行いました. SO で "[opencv] Mat::ones" または "[opencv] +mat +ones" を検索しても、これを解決できませんでした。

4

2 に答える 2

9

私は OpenCV を使用していませんが、ここで何が起こっているかはわかっていると思います。データ型を定義していますが、その値 '1' を要求しています。このMatクラスは、マルチチャネル データ型を使用しているという事実に注意を払っていないように見えるため、単に '1' を 3 バイトの符号なし char としてキャストします。

したがって、関数を使用する代わりにones、スカラー コンストラクターを使用します。

cv::Mat img_C3( x, y, CV_8UC3, CV_RGB(1,1,1) );
于 2012-09-10T00:37:01.493 に答える