opencv mat数据类型用指针ptr正确表示的方法

opoenCv中的Mat 的数据类型是可以通过指针 以ptr的形式来索引或者遍历的。

第一种方法

    cv::Mat image = cv::Mat(400, 600, CV_8UC1); //宽400,长600
    uchar * data00 = image.ptr<uchar>(0);

上边表示的第一行第1个像素的指针。

uchar * data10 = image.ptr<uchar>(1);

上边表示第2行第1个像素指针。

可以通过*data00 ++, 或者data00[j]来向后索引第一行的第j个元素。

使用方法如下:


int nRow = src.rows;
int nCol = src.cols;
int cnt =0;
for (int i = 0; i < nRow; i++)
{
    uchar *data = thresh.ptr<uchar>(i);
    for (int j = 0; j < nCol; j++)
    {
        if (*data == 255)
        *data++;
    }

}

另一种方法可以如下

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

表示第1行的第2个像素的数值。

image有400行,有400*600个像素。假设现在你想得到第3行第42个像素的指针,如果你写成:

uchar * data = image.ptr<uchar>(3*image.cols + 41);
这样写是错误的,会出现上面的错误。你得到的不是第3行第42个像素的指针,而是第(3×image.cols + 41)行第0个像素的指针,因为没有(3×image.cols + 41)行,所以没有这个指针,所以错误。
正确的写法:

uchar  data = image.ptr<uchar>(3)[41];
使用方法:

int Radius = 4;
int nRow = Radius*2;
int nCol = Radius;
int startX = Xr;
int startY = Yr ;
int cnt =0;

int rr = Radius;
int m,n;
for ( m = startY-rr; m < startY+rr; m++)
{

     //从左到右的列也就是x坐标
     for ( n = startX; n < (startX + nCol); n++)
     {
         uchar data = img3.ptr<uchar>(m)[n];
         printf("(%d,%d):%d \n",m,n,data);
  
     }
 
}


sitemap