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;
}声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。
- 上一篇:没有了
- 下一篇:没有了
