OpenCV2 的像素值读写
之前一直在看OpenCV1,现在发现主流都在用OpenCV2了,所以这两天看了看于仕琪老师写的《OpenCV入门教程》,基本对OpenCV2 的语法有了了解。
OpenCV2 中有了 Mat 类,使得像素的读写更加容易。有三种方法可以读写Mat的像素值。分别是:at() 函数,迭代器,指针。
例子如下:
1. 使用 at() 函数
核心代码:
uchar value = grayim.at<uchar>(i,j); grayim.at<uchar>(i,j)=128;
完整代码:
#include<iostream> #include<opencv2opencv.hpp> using namespace std; using namespace cv; int main(int argc,char* argv[]){ Mat grayim(600,800,CV_8UC1); Mat colorim(600,800,CV_8UC3); for(int i=0;i<grayim.rows;i++){ for(int j=0;j<grayim.cols;j++){ grayim.at<uchar>(i,j)=(i+j)%255; } } for(int i=0;i<colorim.rows;i++){ for(int j=0;j<colorim.cols;j++){ Vec3b pixel; pixel[0]=i%255; pixel[1]=j%255; pixel[2]=0; colorim.at<Vec3b>(i,j)=pixel; } } imshow("grayim",grayim); imshow("colorim",colorim); waitKey(0); return 0; }
2. 使用迭代器
这里不再使用 i,j 变量,而是直接用迭代器获取每个像素的指针,然后依次操作像素
核心代码:
MatIterator_<uchar> grayit, grayend; grayit = grayim.begin<uchar>(); grayend=grayim.end<uchar>();
完整代码:
int main(int argc,char* argv[]){ Mat grayim(600,800,CV_8UC1); Mat colorim(600,800,CV_8UC3); MatIterator_<uchar> grayit, grayend; for(grayit=grayim.begin<uchar>(),grayend=grayim.end<uchar>();grayit!=grayend;grayit++){ *grayit=rand()%255; } MatIterator_<Vec3b> colorit, colorend; for(colorit=colorim.begin<Vec3b>(),colorend=colorim.end<Vec3b>();colorit!=colorend;colorit++){ (*colorit)[0]=rand()%255; (*colorit)[1]=rand()%255; (*colorit)[2]=rand()%255; } imshow("grayim",grayim); imshow("colorim",colorim); waitKey(0); return 0; }
3. 使用指针
指针操作不可靠,除非注重程序运行速度,一般情况不用
核心代码:
uchar* p=grayim.ptr<uchar>(i); //第i行开头的指针 p[j]=(i+j)%255;//第i行第j列的像素值
完整代码:
int main(int argc,char* argv[]){ <span style="white-space:pre"> </span>Mat grayim(600,800,CV_8UC1); <span style="white-space:pre"> </span>Mat colorim(600,800,CV_8UC3); <span style="white-space:pre"> </span>for(int i=0;i<grayim.rows;i++){ <span style="white-space:pre"> </span>uchar* ptr=grayim.ptr<uchar>(i); <span style="white-space:pre"> </span>for(int j=0;j<grayim.cols;j++) <span style="white-space:pre"> </span>ptr[j]=(i+j)%255; <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>for(int i=0;i<colorim.rows;i++){ <span style="white-space:pre"> </span>Vec3b* ptr=colorim.ptr<Vec3b>(i); <span style="white-space:pre"> </span>for(int j=0;j<colorim.cols;j++){ <span style="white-space:pre"> </span>ptr[j][0]=i%255; <span style="white-space:pre"> </span>ptr[j][1]=j%255; <span style="white-space:pre"> </span>ptr[j][2]=0; <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>imshow("grayim",grayim); <span style="white-space:pre"> </span>imshow("colorim",colorim); <span style="white-space:pre"> </span>waitKey(0); <span style="white-space:pre"> </span>return 0; }
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。