任何图像处理算法,都是从操作每个像素开始的,刚接触Opencv,写的第一个小程序:分别用动态地址和指针操作像素画圆。
用的是VS2015搭opencv3.0
一.首先是用动态地址计算来操作像素,这种方法简洁明了,符合大家对像素的直观认识。
#include
#include
#include
using namespace std;
using namespace cv;
void pcircle(Mat& inputImage,Mat& outputImage);
int main()
{
Mat srcImage(500, 500, CV_8UC3, Scalar(255, 255, 255));
imshow("原图", srcImage);
Mat dstImage;
double time0 = static_cast<double>(getTickCount());
pcircle(srcImage, dstImage);
time0 = ((double)getTickCount() - time0) / getTickFrequency();
cout << "此方法运行时间为:" << time0<< "秒" << endl;
imshow("效果图", dstImage);
waitKey(0);
}
void pcircle(Mat&inputImage,Mat& outputImage)
{
outputImage = inputImage.clone();
int rowNumber = outputImage.rows;
int colNumber = outputImage.cols;
for (int i = 0; i < rowNumber; i++)
{
for (int j = 0; j < colNumber; j++)
{
if (((i - 250)*(i - 250) + (j - 250)*(j - 250) <= 10000))
{
outputImage.at<Vec3b>(i, j)[0] = 0;
outputImage.at<Vec3b>(i, j)[1] = 0;
outputImage.at<Vec3b>(i, j)[2] = 0;
}
}
}
}
效果图如图
需要注意的是,如果把if (((i - 250)*(i - 250) + (j - 250)*(j - 250) <= 10000))里的<=改成==,则图像变成变径为100的圆的部分点,如图。若要操作像素画连续空心圆,后续会修改程序尝试。暂时没有写出程序,也希望大家给出建议。
二.用指针访问像素的这种方法利用的是C语言中的操作符[ ]。这种方法最快。
#include
#include
#include
#include
using namespace std;
using namespace cv;
void pcircle(Mat& inputImage,Mat& outputImage);
int main()
{
Mat srcImage(500, 500, CV_8UC3, Scalar(255, 255, 255));
imshow("原图", srcImage);
Mat dstImage;
double time0 = static_cast<double>(getTickCount());
pcircle(srcImage, dstImage);
time0 = ((double)getTickCount() - time0) / getTickFrequency();
cout << "此方法运行时间为:" << time0<< "秒" << endl;
imshow("效果图", dstImage);
waitKey(0);
}
void pcircle(Mat&inputImage,Mat& outputImage)
{
outputImage = inputImage.clone();
int rowNumber = outputImage.rows;
int colNumber = outputImage.cols;
for (int i = 0; i < rowNumber; i++)
{
uchar*data = outputImage.ptr<uchar>(i);
for (int j = 0; j < colNumber; j++)
{
if (((i - 250)*(i - 250) + (j - 250)*(j - 250) <= 10000))
{
data[3 * j] = 0;
data[3 * j+1] = 0;
data[3 * j+2] = 255;
}
}
}
}
效果如下:
比较两种方法,用指针用时为0.00204492秒,动态地址方法用时为0.022096秒,用指针显然更快。
另,此程序用到的函数有:计时函数--getTickCount()和getTickFrequency();用法见图中程序。