练习:创建一个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;

}

最新文章

  1. MRC下多个对象的内存管理
  2. mysql replace 替换函数
  3. 专为物联网开发的开源操作系统Contiki(转)
  4. 简单的缓存代理HTTP服务器
  5. Java练习题
  6. win7下wubi安装Ubuntu,重装win7后找回Ubuntu启动项
  7. CCF系列之门禁系统(201412-1)
  8. 关于WebApi 跨域问题的解决的方式
  9. bzoj4785:[ZJOI2017]树状数组:二维线段树
  10. COSC2309/2347 Semester 1, 2019
  11. less的基本语法
  12. .NET Core 3.0 跟踪
  13. Linux基础六(网络管理)
  14. 【洛谷】P4198 楼房重建
  15. CentOS 7安装和配置ssh
  16. fckeditor 数据库 取值 显示
  17. threejs 通过bufferGeometry处理每一个点的位置和颜色
  18. python之jsonpath的使用
  19. [odroid-pc] ubuntu12.04 64bit Android4.0.3 源码编译报错及解决的方法
  20. spring mvc: xml生成

热门文章

  1. 为什么在3ds Max 按系统默认的快捷键AIT+W 视口最大化切换没反应?
  2. DNS BIND之dnssec安全介绍
  3. ffmpeg命令详解(转)
  4. [MST] Defining Asynchronous Processes Using Flow
  5. GNU-libiconv编码转换库的使用举例
  6. iOS代码添加视图约束
  7. 1.boost库的安装
  8. 什么是MySQL?(一)
  9. C语言基础-第五章
  10. RMAN动态视图