如何在OpenCV 2.0的新「Mat」類中按行訪問元素?文檔鏈接如下,但我無法理解它。 http://opencv.willowgarage.com/documentation/cpp/basic_structures.html#mat在OpenCV C++中訪問「Mat」對象(而不是CvMat對象)中的矩陣元素
22
A
回答
44
在文檔:
http://docs.opencv.org/2.4/modules/core/doc/basic_structures.html#mat
它說:
(...)如果你知道矩陣元素 類型,例如它是浮動,那麼你可以在< 使用>()方法
也就是說,你可以使用:
Mat M(100, 100, CV_64F);
cout << M.at<double>(0,0);
也許是更容易使用Mat_
類。它是Mat
的模板包裝。 Mat_
已重載operator()
以訪問元素。
1
OCV竭盡全力確保在不知道元素類型的情況下無法做到這一點,但如果您想要一種易於編碼但不是非常有效的方式來讀取它類型 - 無意義的,您可以使用某種東西像
double val=mean(someMat(Rect(x,y,1,1)))[channel];
要做得很好,你必須知道類型。在<>方法是安全的方式,但如果你做得正確,直接訪問數據指針通常會更快。
9
上面提供的想法很好。要快速訪問(如果你想使一個實時的應用程序),你可以嘗試以下方法:
//suppose you read an image from a file that is gray scale
Mat image = imread("Your path", CV_8UC1);
//...do some processing
uint8_t *myData = image.data;
int width = image.cols;
int height = image.rows;
int _stride = image.step;//in case cols != strides
for(int i = 0; i < height; i++)
{
for(int j = 0; j < width; j++)
{
uint8_t val = myData[ i * _stride + j];
//do whatever you want with your value
}
}
指針訪問比Mat.at <>訪問快得多。希望能幫助到你!
+1
指針訪問成本與Mat.at <>完全相同(在發佈時進行編譯時)。唯一的區別是斷言,除非代碼以調試模式編譯,否則它們是活動的。 – 2016-08-17 15:48:30
1
基於@J。 CALLEJA說,你有兩個選擇
隨機存取
如果你想隨機存取墊的元素,只是簡單地使用
at<data_Type>(row_num, col_num) = value;
連續獲得
如果你想連續訪問,OpenCV提供與STL迭代器兼容的Mat迭代器
MatIterator_<double> it, end;
for(it = I.begin<double>(), end = I.end<double>(); it != end; ++it)
{
//do something here
}
或
for(int row = 0; row < mat.rows; ++row) {
float* p = mat.ptr(row); //pointer p points to the first place of each row
for(int col = 0; col < mat.cols; ++col) {
*p++; // operation here
}
}
我借用一篇博客文章中Dynamic Two-dimensioned Arrays in C
相關問題
- 1. OpenCV訪問MAT對象中的RGB值
- 2. 陣列對象中的訪問元素
- 3. OpenCV Mat對象的訪問值UINT16
- 4. OpenCV:矩陣元素訪問
- 5. OpenCV中的矩陣乘法 - 組合cv :: Mat和cv :: Scalar對象
- 6. OpenCV Mat類:訪問多通道矩陣的元素
- 7. 訪問Java中的OpenCV Mat元素
- 8. OpenCV - 創建Mat對象陣列
- 9. OpenCV:訪問5D矩陣的元素
- 10. 訪問對象數組中的php對象中的元素
- 11. 在PHP中訪問JSON對象元素
- 12. R對象不是矩陣
- 13. 訪問對象中的元素
- 14. 如何訪問對象中的元素?
- 15. 訪問player.getIframe()對象中的元素?
- 16. 如何從python中的mat文件訪問矩陣的元素?
- 17. 訪問opencv矩陣CV_32S元素
- 18. 訪問元素JavaScript對象
- 19. C++如何訪問元素對象
- 20. 在OpenCV中訪問Mat的像素
- 21. 訪問對象而不是數組元素
- 22. 如何在opencv中訪問Cvmat *的元素
- 23. 對象中的指針矩陣C
- 24. 在JSP中訪問Model對象而不使用ModelAndView對象?
- 25. 訪問OpenCV中的多維Mat的子矩陣
- 26. 在OpenCV中更新Mat的子矩陣
- 27. 訪問C中動態對象中的元素#
- 28. 在對象對象內訪問數組的元素
- 29. 在JSON對象中訪問數組元素是未定義的
- 30. 如何在JavaScript回調(而不是舊對象)中訪問更新的對象
圖片如何設置一個特定的值M的一些特定的指數? – damned 2011-11-05 19:54:53
@sumit at <>()方法返回對元素的引用。您可以使用: M.at(0,0)= value; –
2011-11-07 13:58:22
我很確定這個答案的例子是有缺陷的。我相信在內部不安全,因此在uint矩陣上使用double會產生不希望的/損壞的結果。建議更正。 – Catskul 2011-12-16 20:04:44