OpenCV学习笔记09--通过cvPtr2D或指针算法绘制图形
练习:创建一个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学习笔记(七)SVM+HOG
opencv学习笔记(七)SVM+HOG 一.简介 方向梯度直方图(Histogram of Oriented Gradient,HOG)特征是一种在计算机视觉和图像处理中用来进行物体检测的特征描述子 ...
- opencv学习笔记(五)镜像对称
opencv学习笔记(五)镜像对称 设图像的宽度为width,长度为height.(x,y)为变换后的坐标,(x0,y0)为原图像的坐标. 水平镜像变换: 代码实现: #include <ios ...
- opencv学习笔记(一)IplImage, CvMat, Mat 的关系
opencv学习笔记(一)IplImage, CvMat, Mat 的关系 opencv中常见的与图像操作有关的数据容器有Mat,cvMat和IplImage,这三种类型都可以代表和显示图像,但是,M ...
- (转) OpenCV学习笔记大集锦 与 图像视觉博客资源2之MIT斯坦福CMU
首页 视界智尚 算法技术 每日技术 来打我呀 注册 OpenCV学习笔记大集锦 整理了我所了解的有关OpenCV的学习笔记.原理分析.使用例程等相关的博文.排序不分先后,随机整理的 ...
- OpenCV学习笔记之课后习题练习3-5
OpenCV学习笔记之课后习题练习2-5 练习使用感兴趣区域(ROI).创建一个210*210的单通道图像并将其归0.在图像中使用ROI和cvSet()建立一个增长如金字塔状的数组. 参考博文:www ...
- 【opencv学习笔记八】创建TrackBar轨迹条
createTrackbar这个函数我们以后会经常用到,它创建一个可以调整数值的轨迹条,并将轨迹条附加到指定的窗口上,使用起来很方便.首先大家要记住,它往往会和一个回调函数配合起来使用.先看下他的函数 ...
- 【opencv学习笔记七】访问图像中的像素与图像亮度对比度调整
今天我们来看一下如何访问图像的像素,以及如何改变图像的亮度与对比度. 在之前我们先来看一下图像矩阵数据的排列方式.我们以一个简单的矩阵来说明: 对单通道图像排列如下: 对于双通道图像排列如下: 那么对 ...
- 【opencv学习笔记六】图像的ROI区域选择与复制
图像的数据量还是比较大的,对整张图片进行处理会影响我们的处理效率,因此常常只对图像中我们需要的部分进行处理,也就是感兴趣区域ROI.今天我们来看一下如何设置图像的感兴趣区域ROI.以及对ROI区域图像 ...
- opencv学习笔记D01
目录 opencv学习笔记D01 一.图片读取 二.图片保存 三.图片展示 四.图片缩放 五.四种常用插值方式的比较 1.最近邻插值 2.双线性插值 3.区域插值 4.三次样条插值 我是尾巴: ope ...
随机推荐
- 3ds max打造诱人三维水果教程:鸭梨_3dmax教程
本系列我们介绍用3DsMAX打造美味诱人水果的实例,入门者可以按照步骤学习简单的造型和材质设定.之前我们介绍了苹果和桔子的绘制方法,今天我们介绍的主角是——鸭梨. 进入“创建”命令面板.选择“图形”按 ...
- 第三方库requests
requests库 # 1.记得安装 第三方 模块 requests # pip install requests import requests url = 'http://www.baidu.co ...
- redis做成windows服务
打开cmd切换到redis根目录 执行安装命令 redis-server.exe --service-install redis.windows.conf --loglevel verbose 卸载 ...
- 学习参考《父与子的编程之旅python【第二版】》高清中文版PDF+高清英文版PDF+源代码
对于初步接触编程语言的朋友,推荐看一看<父与子的编程之旅第2版>,对于完全编程零基础的很友好! 图文并茂,过多的文字堆垒很容易让人产生厌倦情绪,也更容易让人产生放弃的想法.使用了大量插图, ...
- matlab 中语句 a(b)的意思
a=[1 2; 3, 4; 5, 6]; b=[1 3 2 1; 1 2 4 2]; c=a(b) c = 1 5 3 1 1 3 ...
- 2015 Multi-University Training Contest 2 hdu 5308 I Wanna Become A 24-Point Master
I Wanna Become A 24-Point Master Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 ...
- XML快速注释
eclipse中编辑java或C/C++,python文件时,注释的快捷键均为 "CTRL + / ",编辑xml文件时,该快捷键无效. eclipse XML 注释:CTRL + ...
- Qt之QThread
简述 QThread类提供了与系统无关的线程. QThread代表在程序中一个单独的线程控制.线程在run()中开始执行,默认情况下,run()通过调用exec()启动事件循环并在线程里运行一个Qt的 ...
- UILite-MFC/WTL/DirectUI界面库
之前写了UILite库介绍: http://blog.csdn.net/zhangzq86/article/details/9093945 如今UILite库能够使用git訪问了: https://g ...
- 使用java源代码生成Kettle 4.4
kettle作为ETL工具.其功能日趋完好,已得到广大数据挖掘爱好者的青睐.又由于他是java开源项目.为适应项目需求.有必要研究其源代码,最好可以集成到Java项目中.作为项目执行流程的一个重要环节 ...