Opencv遍历Mat的方式

Mat遍历

坐标模式

.at<typename>(i,j)

for(int i=0;i<img.rows;i++)  
    {  
        for(int j=0;j<img.cols;j++)  
        {  
        	//.at<Vec3b>(i,j)取出三通道的点 .at<uchar>(i,j)取出灰度图像的点
            image.at<Vec3b>(i,j)[0]=image.at<Vec3b>(i,j)[0]/2;  
            image.at<Vec3b>(i,j)[1]=image.at<Vec3b>(i,j)[1]/2;  
            image.at<Vec3b>(i,j)[2]=image.at<Vec3b>(i,j)[2]/2;  
        }  
    }  
}  

Opencv定义了一个Mat的模板子类``Mat_`,它重载了operator()更方便取图像上的点

Mat m2(300, 500, CV_8UC3, Scalar(0, 0, 0));
Mat_<Vec3b> im = m2;
for (int i = 0; i < im.rows; i++) {
    for (int j = 0; j < im.cols; j++) {
        im(i, j)[0] = im(i, j)[0] + (uchar) (255 / 2);
        im(i, j)[1] = im(i, j)[1] + (uchar) 0;
        im(i, j)[2] = im(i, j)[2] + (uchar) (111 / 2);
    }
}
指针

行指针

for (int row = 0; row < height; row++) {
	Vec4b* it = img.ptr<Vec4b>(row);
	for (int col = 0; col < width; col++) {
		(*it)[0]=0;
		(*it)[1]=0;
		(*it)[2]=0;
		(*it)[3]=255;
		it++;
	}
}

数据指针

for (int row = 0; row < height; row++) {
	const uchar* ptr = img.ptr(row);
	for (int col = 0; col < width; col++) {
		ptr[0]=0;
		ptr[1]=0;
		ptr[2]=0;
		ptr[3]=255;
		ptr += 4;
	}
}
迭代器

迭代器的方式还不怎么会用,也不习惯使用这种方式(比较慢)

Mat img(2, 2, CV_8UC3, Scalar(10,10,10));
cout << img << endl;
//如果要修改迭代器指向的值,可以使用 MatIterator_<Vec3b>
for (MatConstIterator_<Vec3b> it = img.begin<Vec3b>(); it != img.end<Vec3b>(); it++) {
	cout<<(*it)<<endl;
    }

遍历的时间比较,可以看看这各个【OPENCV】cv::Mat像素遍历方法比较
opencv 遍历mat的三种方法
Mat像素点位置的读取和设置方式

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值