• 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;

    }

  • 相关阅读:
    11.2hadoop监控:日志配置、堆栈跟踪、度量和JMX
    11.1.3hadoop工具dfsadmin、fsck、数据库扫描器、均衡器
    11.1.2hadoop 安全模式
    11.1.1namenode和datanode的数据结构和格式以及镜像fsimage和编辑日志edit
    10.5 hadoop集群基准评测程序测试
    10.4 hadoop安全性kerberos安全验证和委托令牌
    零基础学习python_生成器(49课)
    安全测试5_服务端的安全漏洞(SQL注入、命令注入、文件操作类)
    安全测试4_客户端的安全漏洞(XSS、CSRF、点击劫持、URL跳转)
    零基础学习python_魔法方法(41-48课)(迭代器)
  • 原文地址:https://www.cnblogs.com/yfceshi/p/7044447.html
Copyright © 2020-2023  润新知