首頁 > 後端開發 > C++ > 與「src.at(i,j)」相比,為什麼 OpenCV 中的「Point(x,y)」與「line()」一起使用時會產生意外結果?

與「src.at(i,j)」相比,為什麼 OpenCV 中的「Point(x,y)」與「line()」一起使用時會產生意外結果?

Linda Hamilton
發布: 2024-12-19 07:25:09
原創
114 人瀏覽過

Why does `Point(x,y)` in OpenCV produce unexpected results when used with `line()` compared to `src.at(i,j)`?

OpenCV:理解點(x,y)表示

在影像處理中,理解點的順序至關重要。 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);
登入後複製

成功地將整個影像填充為白色。

答案:

解釋在於使用不同的表示形式點:

  • src.at(i,>
  • src.at(i, j)
  • :使用(i,j) 作為(行,列)。
  • Point(x,y)
:使用 (x,y) 作為(列,行)。

這種差異源自於 OpenCV 的 Mat 的雙重性質,它既代表影像又代表矩陣。在矩陣表示法中,使用行主序,其中第一個索引表示行,第二個索引表示列。此約定與 src.at(i,j) 對齊。

相反,點的座標系遵循影像符號,其中第一個值指定 x 方向(列),第二個值指定value 指定 y 方向(行)。這解釋了 Point(x,y) 中 (column,row) 排序的使用以及與 src.at(column,row) 的對齊。

理解這種區別對於有效存取和修改至關重要OpenCV 中的點。

以上是與「src.at(i,j)」相比,為什麼 OpenCV 中的「Point(x,y)」與「line()」一起使用時會產生意外結果?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板