opencv3::Mat元素的获取、at、ptr

参考

http://lib.csdn.net/article/opencv/28700?knId=1218
https://blog.csdn.net/xiaowei_cqu/article/details/19839019
https://blog.csdn.net/u011574296/article/details/70139563

int main(int argc, char ** argv)
{
    Mat img(5, 3, CV_8UC3, Scalar(50, 50, 50));
    cout << "rows:" <<img.rows << endl;
    cout << "cols:" << img.cols << endl;
    cout << "channels:" << img.channels() << endl;
    cout << "dims:" << img.dims << endl;

    // 每个元素大小,单位字节
    cout << "elemSize:" <<img.elemSize() << endl;    //1 * 3,一个位置,三个通道的CV_8U  
    // 每个通道大小,单位字节
    cout << "elemSize1:"<<img.elemSize1() << endl;   //1 

    /*
    每一行(第一级)在矩阵内存中,占据的字节的数量
    二维图像由一行一行(第一级)构成,而每一行又由一个一个点(第二级)构成
    二维图像中step[0]就是每一行(第一级)在矩阵内存中,占据的字节的数量。
    也就是说step[i]就是第i+1级在矩阵内存中占据的字节的数量。
    */
    cout << "step[0]:" << img.step[0] << endl;   //3 * ( 1 * 3 )  
    cout << "step[1]:" << img.step[1] << endl;   //1 * 3  
    cout << "total:" << img.total() << endl;   //3*5  

    //----------------------地址运算---------------------//
    for (int row = 0; row < img.rows; row++)
    {
        for (int col = 0; col < img.cols; col++)
        {
            //[row,col]像素的第1通道地址解析为Blue通道
            *(img.data + img.step[0] * row + img.step[1] * col) += 15;

            //[row,col]像素的第2通道地址解析为Green通道
            *(img.data + img.step[0] * row + img.step[1] * col + img.elemSize1()) += 16;

            //[row,col]像素的第3通道地址解析为Red通道
            *(img.data + img.step[0] * row + img.step[1] * col + img.elemSize1() * 2) += 17;

        }
    }
    cout << "地址运算:\n" << img << endl;

    //----------------------Mat的成员函数at<>()---------------------//
    for (int row = 0; row < img.rows; row++)
    {
        for (int col = 0; col < img.cols; col++)
        {
            /*
            .at  return (img.data + step.p[0] * i0))[i1]
            直接给[row,col]赋值,但是访问速度较慢
            */
            img.at<Vec3b>(row, col) = Vec3b(0, 1, 2);
        }
    }
    cout << "成员函数at<>():\n" << img << endl;

    //----------------------Mat的成员函数ptr<>()---------------------//
    int nr = img.rows;
    int nc = img.cols * img.channels();//每一行的元素个数
    for (int j = 0; j < nr; j++)
    {
        uchar* data = img.ptr<uchar>(j);
        for (int i = 0; i < nc; i++)
        {
            *data++ += 99;
        }
    }
    cout << "成员函数ptr<>():\n" << img << endl;
}

这里写图片描述

猜你喜欢

转载自blog.csdn.net/BoaHock/article/details/80790323