最近在学习vs2010并结合opencv2.4.3进行图像处理,首先研究了在opencv中如何去访问像素,查阅资料,浏览博客,总结了一下,一般有三种方法:Mat类的.at()函数,指针,迭代器,代码如下:
// sy1.cpp : 定义控制台应用程序的入口点。
/////////////////////////////通过不同的方式去访问图像像素/////////////////////////////////////////////
#include "stdafx.h"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/core/core.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include
using namespace std;
using namespace cv;
int _tmain(int argc, _TCHAR* argv[])
{
double t1=(double)getTickCount(); //记录起始时间
Mat img=imread("C:\\Users\\Administrator\\Desktop\\002.bmp");
Mat img_gray;
cvtColor(img,img_gray,CV_RGB2GRAY); //彩图转为灰度图
imwrite("C:\\Users\\Administrator\\Desktop\\002ff.bmp",img_gray);
Mat img2(img_gray.rows,img_gray.cols,CV_8U);
/////////////////////////////指针访问/////////////////////////////////////////////
int i,j;
uchar* pt;
for (i=0;i
{
pt=img_gray.ptr
(i); //获取第i行的首地址 for (j=0;j
{
if (pt[j]>100) //第i行的第j个像素
{
img2.at
(i,j)=255; }
else
img2.at
(i,j)=0; }
}
///////////////////最简单的.at()函数//////////////////////////////////////////////
////////////////////////不推荐此方式,太慢/////////////////////////////////////////
int i,j;
for (i=0;i
{
for (j=0;j
{
if(img_gray.at
(i,j)>100) img2.at
(i,j)=255; else
img2.at
(i,j)=0; }
}
/////////////////////使用迭代器去访问//////////////////////////////////////////////
///////////////速度不是最快的,但是安全/////////////////////////////////////////////
Mat_
Mat_
while(it!=img_gray.end
{
if (*it>100)
{
(*it1)=255;
}
else
{
(*it1)=0;
}
++it;
++it1;
}
double t2=(double)getTickCount(); //结束时间
double t3=(t2-t1)/getTickFrequency(); //耗时
cout<
namedWindow("ff");
imshow("ff",img2);
imwrite("C:\\Users\\Administrator\\Desktop\\shiyan.bmp",img2);
waitKey(0);
return 0;
}
总结,指针的方法是最快的;at()函数法最慢,但是理解起来方便;迭代器法居中,但是安全。