OpenCV Learning: 图像像素Mat操作方法2
2013-10-31 11:00
323 查看
原文写于2013年7月31日
1. at方法
使用at模板函数能访问某行某列的像素
例如:
img1.at<cv::Vec3b>(j,i)
访问其各个通道:
img1.at<cv::Vec3b>(j,i)[0] b通道
img1.at<cv::Vec3b>(j,i)[1] g通道
img1.at<cv::Vec3b>(j,i)[2] r通道
2.ptr方法
使用ptr模板可以得到行数据的头指针
uchar * data=img1.ptr<uchar>(j);//得到j行指针(储存行数据的地址)
访问第i个像素各个通道:
本质是根据指针移步实现,根据图像结构来移步
data[i*img1.nchanles+0]
data[i*img1.nchanles+1]
data[i*img1.nchanles+2]
3.iterator方法(迭代器)
迭代器方法,类似一维数组的模式,利用迭代器操作,方便操作像素
cv::Mat_<cv::Vec3b>::iterator it=img1.begin<cv::Vec3b>();cv::Mat_<cv::Vec3b>::iterator it_end=img1.end<cv::Vec3b>();
访问像素:
(*it)[0] b通道
(*it)[1] g通道
(*it)[2] r通道
it++
1. at方法
使用at模板函数能访问某行某列的像素
例如:
img1.at<cv::Vec3b>(j,i)
访问其各个通道:
img1.at<cv::Vec3b>(j,i)[0] b通道
img1.at<cv::Vec3b>(j,i)[1] g通道
img1.at<cv::Vec3b>(j,i)[2] r通道
2.ptr方法
使用ptr模板可以得到行数据的头指针
uchar * data=img1.ptr<uchar>(j);//得到j行指针(储存行数据的地址)
访问第i个像素各个通道:
本质是根据指针移步实现,根据图像结构来移步
data[i*img1.nchanles+0]
data[i*img1.nchanles+1]
data[i*img1.nchanles+2]
3.iterator方法(迭代器)
迭代器方法,类似一维数组的模式,利用迭代器操作,方便操作像素
cv::Mat_<cv::Vec3b>::iterator it=img1.begin<cv::Vec3b>();cv::Mat_<cv::Vec3b>::iterator it_end=img1.end<cv::Vec3b>();
访问像素:
(*it)[0] b通道
(*it)[1] g通道
(*it)[2] r通道
it++
// test12.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include "cv.h" #include "highgui.h" #include <iostream> using namespace std; using namespace cv; int _tmain(int argc, _TCHAR* argv[]) { Mat img1=imread("d:\\lena.jpg");//512*512的有点大了,不利于数据观察 namedWindow("demo"); imshow("demo",img1); int i,j; //方法1:at方法 cout<<"方法1:at方法"<<endl; cout<<"-----------------------------------------------"<<endl; for(j=0;j<img1.rows;j++)//按照图像布局打印数值 { for(i=0;i<img1.cols;i++) //注意J和I的参数顺序,表示第I行J列 { cout<<(int)img1.at<cv::Vec3b>(j,i)[0];//b通道 //cout<<" "; cout<<(int)img1.at<cv::Vec3b>(j,i)[1];//g通道 //cout<<" "; cout<<(int)img1.at<cv::Vec3b>(j,i)[2];//r通道 //cout<<" "; cout<<"\t"; } cout<<endl; } //////////////////////////////////////////////////////// cout<<"-----------------------------------------------"<<endl; //方法2:ptr方法 cout<<"方法2:ptr方法"<<endl; cout<<"-----------------------------------------------"<<endl; for(j=0;j<img1.rows;j++) { uchar * data=img1.ptr<uchar>(j);//得到行指针(储存行数据的地址) for (i=0;i<img1.cols*img1.channels();i++)//行数据的长度为 列数*通道数 { //仿照方式格式打印出来 cout<<(int)data[i];////b通道 i++; cout<<(int)data[i];//g通道 i++; cout<<(int)data[i];//r通道 cout<<"\t"; } cout<<endl; } cout<<"-----------------------------------------------"<<endl; cout<<"方法3:iterator方法"<<endl;// cout<<"-----------------------------------------------"<<endl; cv::Mat_<cv::Vec3b>::iterator it=img1.begin<cv::Vec3b>(); cv::Mat_<cv::Vec3b>::iterator it_end=img1.end<cv::Vec3b>(); for (i=0;it!=it_end;it++)//类似一维数组了 { cout<<(int)(*it)[0];//b cout<<(int)(*it)[1];//g cout<<(int)(*it)[2];//r cout<<"\t"; i++; if (i>0&&i%img1.cols==0) { cout<<endl;// } } cout<<"-----------------------------------------------"<<endl; waitKey(0); return 0; }
相关文章推荐
- Opencv--访问Mat图像中每个像素的值
- 【OpenCV】访问Mat图像中每个像素的值
- 访问Mat图像中每个像素的值
- 【OpenCV、Cximage、Mat】访问图像中每个像素的值
- opencv中Mat存储图像和遍历图像像素
- Mat访问图像中每个像素的值
- 《访问Mat图像中每个像素的值》)
- 【OpenCV】访问Mat图像中每个像素的值
- 访问Mat图像中每个像素的值
- opencv图像像素操作方法
- opencv 帧差法找出相差大的图像(包含访问mat的像素值)
- Opencv:Mat图像的复制,以及改变像素点的颜色
- 【OpenCV】访问Mat图像中每个像素的值
- 访问Mat中每个像素的值(简单的图像取反)
- 访问Mat图像中的每个像素的值和IplImage格式图像中每个像素的值
- Opencv中Mat图的长、宽、行、列以及图像像素
- opencv2中使用Mat对图像像素进行操作
- 学习OpenCV2——访问Mat图像的像素值
- OpenCV: cv::Mat图像像素值访问及其坐标系问题
- 【OpenCV】访问Mat图像中每个像素的值