OpenCV Mat資料型別指標ptr的使用

2021-08-21 06:13:31 字數 1371 閱讀 4201

cv::mat image = cv::mat(400, 600, cv_8uc1); //寬400,長600

uchar * data00 = image.ptr(0);

uchar * data10 = image.ptr(1);

uchar * data01 = image.ptr(0)[1];

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(3*image.cols + 41);
這樣寫是錯誤的,會出現上面的錯誤。你得到的不是第3行第42個畫素的指標,而是第(3×image.cols + 41)行第0個畫素的指標,因為沒有(3×image.cols + 41)行,所以沒有這個指標,所以錯誤。 

正確的寫法:

uchar * data = image.ptr(3)[41];
所以要注意這一點:如果程式可以正常編譯,但是執行時出錯,很有可能是你給指標賦值的時候,索引值溢位指定範圍,指標亂指,導致程式跑偏,所以只有在執行時才能發現錯誤。

uchar * data000 = image.ptr(0);

uchar * data100 = image.ptr(1);

uchar * data001 = image.ptr(0)[1];

uchar * data

cv::mat image = cv::mat(400, 600, cv_8uc3); //寬400,長600,3通道彩色

cv::vec3b * data000 = image.ptr(0);

cv::vec3b * data100 = image.ptr(1);

cv::vec3b * data001 = image.ptr(0)[1];

cv::vec3b * data

OpenCV Mat資料型別指標ptr的使用

cv mat image cv mat 400,600,cv 8uc1 寬400,長600 uchar data00 image.ptr 0 uchar data10 image.ptr 1 uchar data01 image.ptr 0 1 解釋 注意 如果你的程式使用來image.ptr指標,...

OpenCV Mat資料型別指標ptr的使用

cv mat image cv mat 400,600,cv 8uc1 寬400,長600 uchar data00 image.ptr 0 uchar data10 image.ptr 1 uchar data01 image.ptr 0 1 data00是指向image第一行第乙個元素的指標。d...

OPENCV Mat的資料型別

1.opencv中mat存在各種型別,其中mat有乙個type 的函式可以返回該mat的型別。型別表示了矩陣中元素的型別以及矩陣的通道個數,它是一系列的預定義的常量,其命名規則為cv 位數 資料型別 通道數 具體的有以下值 2.注意在用at運算子訪問mat時,需特別注意資料型別。3.很坑的一點,op...