OpenCV Mat
數據類型指針ptr
的使用
cv::Mat image = cv::Mat(400, 600, CV_8UC1); //寬400,長600
uchar * data00 = image.ptr<uchar>(0);
uchar * data10 = image.ptr<uchar>(1);
uchar * data01 = image.ptr<uchar>(0)[1];
解釋:
- 定義了一個Mat變量image。
- data00是指向image第一行第一個元素的指針。
- data10是指向image第二行第一個元素的指針。
- data01是指向image第一行第二個元素的指針。
注意:
如果你的程序使用來image.ptr指針,並且出現了下面這樣的錯誤:(假設你使用的軟件是Visual Studio 201x)
某某.exe中的 0x75065b68 處有未經處理的異常:Microsoft C++ 異常; 內存位置0x85e790處的cv::Exception。
這可能是因為你不理解image.ptr這個指針,犯了這樣的錯誤:image.ptr(1);指的不是image中第二個像素,而是第一行第二個像素的指針。
使用上面的代碼舉例:image有400行,有400*600個像素。假設現在你想得到第3行第42個像素的指針,如果你寫成:
uchar * data = image.ptr<uchar>(3*image.cols + 42);
這樣寫是錯誤的,會出現上面的錯誤。你得到的不是第3行第42個像素的指針,而是第(3×image.cols + 42)行第0個像素的指針,因為沒有(3×image.cols + 42)行,所以沒有這個指針,所以錯誤。
正確的寫法:
uchar * data = image.ptr<uchar>(3)[42];
所以要注意這一點:如果程序可以正常編譯,但是運行時出錯,很有可能是你給指針賦值的時候,索引值溢出指定范圍,指針亂指,導致程序跑偏,所以只有在運行時才能發現錯誤。
cv::Mat image = cv::Mat(400, 600, CV_8UC3); //寬400,長600,3通道彩色圖片
uchar * data000 = image.ptr<uchar>(0);
uchar * data100 = image.ptr<uchar>(1);
uchar * data001 = image.ptr<uchar>(0)[1];
uchar * data
cv::Mat image = cv::Mat(400, 600, CV_8UC3); //寬400,長600,3通道彩色圖片
cv::Vec3b * data000 = image.ptr<cv::Vec3b>(0);
cv::Vec3b * data100 = image.ptr<cv::Vec3b>(1);
cv::Vec3b * data001 = image.ptr<cv::Vec3b>(0)[1];
cv::Vec3b * data