OpenCV学习笔记09--通过cvPtr2D或指针算法绘制图形
来源:互联网 发布:ps笔刷for mac 百度云 编辑:程序博客网 时间:2024/06/10 05:07
练习:创建一个1000*1000的三通道图像,将其元素全部置0,以(200,50)和(400,200)为顶点绘制一个绿色平面
我们可以用两种方法来实现这一功能,一个是使用cvPtr2D,但是由于使用了函数,会使程序的效率变低。合适的方法是使用指针直接改变色素的值。
方法一:使用cvPtr2D
CvPtr2D能够根据参数中的行和列读取该位置的元素,但是该元素包含三个指针,分别控制蓝绿红。CvPtr2D指向的是元素的第一个指针,而该元素其他的颜色指针则为cvPtr2D(img,top,left)+1或+2
#include "stdafx.h"
#include "highgui.h"
int _tmain(int argc, _TCHAR* argv[])
{
IplImage *img = cvCreateImage(cvSize(1000,1000), IPL_DEPTH_8U, 3);
cvZero(img);//将图像结构内所有元素置为0
int left = 200, right = 400, top = 50, bottom = 200;
for (; top < bottom; top++)
{
for (; left<right;left++)
{
*(cvPtr2D(img,top,left)+1)=255;//第二个参数,是控制大调整的,在这里即标明处于第几行。而第三个控制小调整,即控制处于该行的哪一列。
}
left = 200; //在进行过一次上面的循环后,left已经加到了400,我们需要将它恢复初值。
}
cvNamedWindow("test", 1);
cvShowImage("test", img);
cvWaitKey(0);
return 0;
}
方法二:使用指针算法
使用指针算法首先要知道画布的指针,然后取得要修改位置的指针。即img->imageData+top*img->widthStep+left*nchannels+channel.
首先我们要清楚图像色素的存储是以元素为单位的,而元素内有多少个通道,一个元素就有多少个指针。所以每一行的元素数为left,则指针数为left*nchannels
Img->imageData是图像元素的初始位置,由于每一行的指针数为img->widthsteps,所以如果起始点上面的行数为top,一共含有的指针就是top*(img->widthStep)。而起始元素左边的元素数为left,每个元素有nchannels个通道,则一共有left*nchannels个指针。而如果我们要操作的是该元素的第channel个指针,就要再加上channel.
#include "stdafx.h"
#include "highgui.h"
int _tmain(int argc, _TCHAR* argv[])
{
IplImage *img = cvCreateImage(cvSize(1000, 1000), IPL_DEPTH_8U, 3);
cvZero(img);
int widthstep = img->widthStep;
int left = 200, width = 200, top = 50, height = 150;
uchar *ptr = (uchar*)(img->imageData+top*widthstep+left*3); //指向要操作的指针
for (int j = 0; j < height; j++)
for (int i = 0; i < width; i++)
{
*(ptr + j*widthstep + i*3) = 255;//由于每个元素含三个指针,所以需要加i*3才能指向下一个元素的该色素
}
cvNamedWindow("test", 1);
cvShowImage("test", img);
cvWaitKey(0);
return 0;
}
- OpenCV学习笔记09--通过cvPtr2D或指针算法绘制图形
- opencv学习笔记(三)-绘制基本图形及文字
- 学习笔记6:图形绘制
- opencv 绘制半透明图形
- opencv 绘制半透明图形 (
- opencv:基本图形绘制
- opencv-python绘制图形
- 【OpenCV】绘制简单图形
- C#学习笔记 :图形绘制基础
- 图形绘制管线的学习笔记
- Open CV 学习笔记:基本图形绘制
- [学习笔记]JavaScript基础--图形绘制
- LearnOpenGL学习笔记2:绘制基础图形
- LearnOpenGL学习笔记2:绘制基础图形
- 【canvas学习笔记二】绘制图形
- OpenCV笔记(二)——基本图形的绘制
- 图像绘制功能【OpenCV学习笔记5】
- OpenCV学习笔记5 - 图像绘制功能
- 推荐学习网站
- 黑马程序员_java语言_IO其他流
- 多线程与并发库高级应用
- 一步一步 实现智能指针(三)
- LightOJ1007---Mathematically Hard (欧拉函数)
- OpenCV学习笔记09--通过cvPtr2D或指针算法绘制图形
- 青春
- 泰国清迈8天自由行小结
- DLL的进入退出——由DLL_PROCESS_ATTACH而联系搜索起来。
- [C#] 汉字转拼音,支持多音字
- 排列组合算法之三: 递归法
- gdb调试dce
- iOS开发 -NSUserDefaults 轻量级快速存储
- 高手必备常用开发宏