opencv访问像素

引言

总结一下,老是记不住。

结论:

img.at<uchar>( row, col );
cv::Mat( rows, cols, type, cv::scalar );
cv::point( col, row )
cv::rect( cols_from, rows_from, width, high );
cv::size( cols, rows );

请添加图片描述

请添加图片描述

1.像素类型

像素的数据类型包括CV_32U,CV_32S,CV_32F,CV_8U,CV_8UC3等。第一个数字表示比特数,第二个数字就表示C++中数据类型,如果还有后面两个字符,这两个字符表示通道数。例如对于CV_32U,表示具有32比特的unsigned int类型;对于CV_8UC3,表示具有8比特,并且有三个通道的unsigned char类型。

OpenCV中,按BGR顺序存储:

  • B–>channels[0]
  • G–>channels[1]
  • R–>channels[2]

2.访问像素

cv::Mat有个at()方法,可以访问图像的单个像素,同时at()方法又是一个模板方法,所以在使用的时候需要传入图像像素的类型,而且这个类型不像C++中的运算类型一样可以自动转换,所以必须准确的传入图像元素类型。

对于单通道元素来说,元素类型为unsigned char的情况下,可以这样访问

for (int i = 0; i < img.rows(); ++i) {
  for (int j = 0; j < img.cols(); ++j) {
    img.at<uchar>(i, j);
  }
}

对于三通道元素彩色图像来说,那么可以这样

for (int i = 0; i < img.rows(); ++i) {
  for (int j = 0; j < img.cols(); ++j) {
    // image.at<cv::Vec3b>(j,i)[channel]= value;
    img.at<cv::Vec3b>(i, j)[0];
    img.at<cv::Vec3b>(i, j)[1];
    img.at<cv::Vec3b>(i, j)[2];
  }
}

或者直接使用数组赋值还更加方便

    image.at<cv::Vec3b>(i, j) = cv::Vec3b(a,b,c);

Vec是opencv中的向量类型,它模板是Vec<T,N>,所以Vec3b表示3个unsigned char组成的向量,Vec2f表示由两个float组成的向量,任何形式的向量都可以用这个Vec来表示的。


Mat_ 也是一个模板类,注意它有一个下划线,以与Mat作为区别。在实际使用中,Mat_ 与 Mat 的操作函数没有多大区别,只不过Mat_需要在创建时定义元素类型,以后再调用它的方法是就不需要再传入数据的类型,而且还定义了一个操作符()来获取元素的位置。

cv::Mat_<uchar> image(image1);
image(20,30) = value;

或者使用

image.at(20,30) = value;

这两个类之间的区别就是一个是定义时指定类型,一个是使用时指定类型,可以按照不同的情况来使用。

3.使用指针遍历像素

for (int i = 0; i < mat.rows; i++) {
    uchar* row = mat.ptr<uchar>(i); 	  // 行指针
    for (int j = 0; j < mat.cols; j++) {  // 遍历每一行
        row[j] = (uchar)((j / 5) * 10); 
    }
}

4.使用迭代器遍历像素

Mat_<Vec3b>::iterator it = M.begin<Vec3b>();//初始位置的迭代器
Mat_<Vec3b>::iterator itend = M.end<Vec3b>();//终止位置的迭代器
for (; it != itend; it++) {
    //处理BGR三个通道
    (*it)[0] = 182;//B
    (*it)[1] = 194;//G
    (*it)[2] = 154;//R
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值