【opencv学习笔记.1】操作像素画圆

来源:互联网 发布:图像分类算法matlab 编辑:程序博客网 时间:2024/05/29 14:02

任何图像处理算法,都是从操作每个像素开始的,刚接触Opencv,写的第一个小程序:分别用动态地址和指针操作像素画圆。

用的是VS2015搭opencv3.0

一.首先是用动态地址计算来操作像素,这种方法简洁明了,符合大家对像素的直观认识。

#include <opencv2/core/core.hpp>

#include<opencv2/highgui/highgui.hpp>

#include<iostream>

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 <opencv2/core/core.hpp>

#include<opencv2/highgui/highgui.hpp>

#include<iostream>

#include<cv.h> 

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();

用法见图中程序。

原创粉丝点击