【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();用法见图中程序。
- 【opencv学习笔记.1】操作像素画圆
- OpenCV学习笔记(1)——操作像素
- 【OpenCV学习笔记】一.操作像素
- Opencv学习笔记之二:操作像素
- 【OpenCV学习笔记 005】 操作像素
- 【OpenCV学习笔记】三、操作像素
- OpenCV学习笔记二:操作像素
- opencv学习笔记 二 操作像素
- 图像的像素点操作【OpenCV学习笔记3】
- 我的OpenCV学习笔记(二):操作每个像素
- openCV学习笔记(四):图像遍历和像素操作
- 像素级的图像处理---opencv.2学习笔记1
- opencv学习(4)像素操作
- 【从零学习openCV】opecv操作像素
- OpenCV 学习(像素操作 2)
- OpenCV学习笔记(二):存取像素
- 【OpenCV学习笔记】十、访问图像像素
- Opencv学习笔记2--像素的访问
- 洛谷 P1186 玛丽卡
- 使用Wamp在win7上搭WEB服务器
- 笔记-git与github的交互初识
- 六级_第二天
- 回溯法输出字符串入栈出栈的全部可能序列
- 【opencv学习笔记.1】操作像素画圆
- 委托、泛型委托等
- Uva1395 Slim Span(最小生成树)
- 栈—— 表达式转换
- java并发基础(三)--- 任务执行(Executor的使用)
- 猜数字游戏
- oracle主键和索引
- HNOI-2004 打鼴鼠
- SPFA——热浪Heat Wave、捉迷藏Hide and Seek、电车