在影像處理中,理解點的順序至關重要。 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 的雙重性質,它既代表影像又代表矩陣。在矩陣表示法中,使用行主序,其中第一個索引表示行,第二個索引表示列。此約定與 src.at
相反,點的座標系遵循影像符號,其中第一個值指定 x 方向(列),第二個值指定value 指定 y 方向(行)。這解釋了 Point(x,y) 中 (column,row) 排序的使用以及與 src.at
以上是與「src.at(i,j)」相比,為什麼 OpenCV 中的「Point(x,y)」與「line()」一起使用時會產生意外結果?的詳細內容。更多資訊請關注PHP中文網其他相關文章!