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;

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章