画像処理では、点の順序を理解することが重要な場合があります。人気のあるコンピューター ビジョン ライブラリである OpenCV は、点の表現に関して混乱を招く可能性のある座標系を利用しています。
質問:
次元 300x200 の行列 src。次の操作を適用すると、
for(int i = 0; i < src.rows; i++){ for(int j = 0; j < src.cols; j++){ line( src, Point(i,j), Point(i,j), Scalar( 255, 0, 0 ), 1,8 ); } } imshow("A",src); waitKey(0);
期待される結果は、画像全体が白い線で塗りつぶされることです。ただし、白になるのは上部のみです。
この動作は、画像全体を白で塗りつぶす次の操作とは対照的です。
for(int i = 0; i < src.rows; i++){ for(int j = 0; j < src.cols; j++){ src.at<uchar>(i,j)=255; } } imshow("A",src); waitKey(0);
。
答え:
説明は、以下に使用されるさまざまな表現にあります。ポイント:
この不一致は、イメージと行列の両方を表す OpenCV の Mat の二重の性質に起因します。行列表記では行優先の順序が使用され、最初のインデックスが行を表し、2 番目のインデックスが列を表します。この規則は src.at
対照的に、点の座標系はイメージ表記に従い、最初の値は x 方向 (列) を指定し、2 番目の値は x 方向 (列) を指定します。値は y 方向 (行) を指定します。これは、Point(x,y) での (column,row) の順序付けの使用と、src.at
この区別を理解することは、効果的にアクセスして変更するために不可欠です。 OpenCV のポイント
以上がOpenCV の `Point(x,y)` を `line()` と一緒に使用すると、`src.at(i,j)` と比較して予期しない結果が生じるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。