练习:创建一个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或指针算法绘制图形的更多相关文章

  1. opencv学习笔记(七)SVM+HOG

    opencv学习笔记(七)SVM+HOG 一.简介 方向梯度直方图(Histogram of Oriented Gradient,HOG)特征是一种在计算机视觉和图像处理中用来进行物体检测的特征描述子 ...

  2. opencv学习笔记(五)镜像对称

    opencv学习笔记(五)镜像对称 设图像的宽度为width,长度为height.(x,y)为变换后的坐标,(x0,y0)为原图像的坐标. 水平镜像变换: 代码实现: #include <ios ...

  3. opencv学习笔记(一)IplImage, CvMat, Mat 的关系

    opencv学习笔记(一)IplImage, CvMat, Mat 的关系 opencv中常见的与图像操作有关的数据容器有Mat,cvMat和IplImage,这三种类型都可以代表和显示图像,但是,M ...

  4. (转) OpenCV学习笔记大集锦 与 图像视觉博客资源2之MIT斯坦福CMU

          首页 视界智尚 算法技术 每日技术 来打我呀 注册     OpenCV学习笔记大集锦 整理了我所了解的有关OpenCV的学习笔记.原理分析.使用例程等相关的博文.排序不分先后,随机整理的 ...

  5. OpenCV学习笔记之课后习题练习3-5

    OpenCV学习笔记之课后习题练习2-5 练习使用感兴趣区域(ROI).创建一个210*210的单通道图像并将其归0.在图像中使用ROI和cvSet()建立一个增长如金字塔状的数组. 参考博文:www ...

  6. 【opencv学习笔记八】创建TrackBar轨迹条

    createTrackbar这个函数我们以后会经常用到,它创建一个可以调整数值的轨迹条,并将轨迹条附加到指定的窗口上,使用起来很方便.首先大家要记住,它往往会和一个回调函数配合起来使用.先看下他的函数 ...

  7. 【opencv学习笔记七】访问图像中的像素与图像亮度对比度调整

    今天我们来看一下如何访问图像的像素,以及如何改变图像的亮度与对比度. 在之前我们先来看一下图像矩阵数据的排列方式.我们以一个简单的矩阵来说明: 对单通道图像排列如下: 对于双通道图像排列如下: 那么对 ...

  8. 【opencv学习笔记六】图像的ROI区域选择与复制

    图像的数据量还是比较大的,对整张图片进行处理会影响我们的处理效率,因此常常只对图像中我们需要的部分进行处理,也就是感兴趣区域ROI.今天我们来看一下如何设置图像的感兴趣区域ROI.以及对ROI区域图像 ...

  9. opencv学习笔记D01

    目录 opencv学习笔记D01 一.图片读取 二.图片保存 三.图片展示 四.图片缩放 五.四种常用插值方式的比较 1.最近邻插值 2.双线性插值 3.区域插值 4.三次样条插值 我是尾巴: ope ...

随机推荐

  1. ARC下dealloc过程及.cxx_destruct的探究

    我是前言 这次探索源自于自己一直以来对ARC的一个疑问,在MRC时代,经常写下面的代码: - (void)dealloc { self.array = nil; self.string = nil; ...

  2. vue非空校验

    效果图 实现代码 //页面html <div> <ul class="listinfo"> <li> <span class=" ...

  3. Qt之图形(绘制漂亮的圆弧)

    简述 综合前面对二维绘图的介绍,想必我们对一些基本绘图有了深入的了解,下面我们来实现一些漂亮的图形绘制. 简述 圆形 效果 源码 弧形 效果 源码 文本 效果 源码 旋转 效果 源码 圆形 经常地,我 ...

  4. jstack命令dump线程信息

    jstack命令dump线程信息 D:\Java\jdk1.8.0_05\bin>jstack.exe 6540 > dump17 6540为java 线程pid: 出来的dump17文件 ...

  5. MapReduce中combine、partition、shuffle的作用是什么

    http://www.aboutyun.com/thread-8927-1-1.html Mapreduce在hadoop中是一个比較难以的概念.以下须要用心看,然后自己就能总结出来了. 概括: co ...

  6. Linux平台不同解压缩命令的使用方法

    作者:郭孝星 微博:郭孝星的新浪微博 邮箱:allenwells@163.com 博客:http://blog.csdn.net/allenwells github:https://github.co ...

  7. linux+apache+mysql+php平台构建及环境配置

    1.我使用的centos6.安装时已经选择安装apach.mysql,事实上在运行下列两行命令的时候又对其进行了更新.所以说装的时候能够不安装,免得浪费时间. yum install php-mysq ...

  8. h5 离线存储

  9. ubuntu14.04下snort的安装(官方文档安装)(图文详解)

    不多说,直接上干货! 最近为了科研,需要安装和使用Snort. snort的官网 https://www.snort.org/ Snort作为一款优秀的开源主机入侵检测系统,在windows和Linu ...

  10. Linux基础04

    ** Linux基本操作常用命令(四) ** Linux系统管理命令 1.top:查看系统资源,每隔三秒刷新一次,按q:退出浏览状态 2.free:查看内存信息,-m,以MB单位显示 3.netsta ...