《学习OpenCV》第三章习题 第3题
生活随笔
收集整理的這篇文章主要介紹了
《学习OpenCV》第三章习题 第3题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
這是一個很有意思的題目,通過這個題我們可以理解圖形的內部存儲和cvPtr*D函數族的使用方法。
簡單來說,圖像就是矩陣,在一般的圖像中,每個像素中存儲了3個變量,分別代表BGR三通道的值,cvPtr*D函數族就是幫助我們快速定位到矩陣中的每個像素點,如本題,我們希望從起始點開始繪制矩形,于是我將從cvPtr2D的參數設置為(left,top)也就是(20,5)。于是函數馬上返回一個指針指向那個像素點的第一個變量,也就是藍色通道的值,由于我們需要的是綠色通道,所以將指針加1讓他指向綠色通道的值。
?
#include "stdafx.h" #include "cv.h" #include "highgui.h"int main(int argc, char** argv) {IplImage *img;img = cvCreateImage(cvSize(200, 200), IPL_DEPTH_8U, 3);cvZero(img);int right = 40, bottom = 20, top = 5, left = 20;for (; top <= bottom; top++){*(cvPtr2D(img, left, top, NULL) + 1) = 255;*(cvPtr2D(img, right, top, NULL) + 1) = 255;}top = 5;for (; left <= right; left++){*(cvPtr2D(img, left, top, NULL) + 1) = 255;*(cvPtr2D(img, left, bottom, NULL) + 1) = 255;}cvNamedWindow("test", CV_WINDOW_AUTOSIZE);cvShowImage("test", img);cvWaitKey();return 0; }
結果顯示的圖像是這樣的:
是不是和我們想象中的不太一樣?好像在縱向是20~40,橫向是5~20。難道說在圖像處理的時候,x軸是縱向而y軸是橫向嗎?我們再想想,cvPtr2D的參數是idx0和idx1,并不是所謂的橫縱坐標,而是矩陣的下標,也就是說idx0是指行下標,idx1是指列下標,這下我們就明白了,x軸實際對應的是列,y軸對應的是行。
因此需要修改一下代碼,如下:
#include "stdafx.h" #include "cv.h" #include "highgui.h"int main(int argc, char** argv) {IplImage *img;img = cvCreateImage(cvSize(200, 200), IPL_DEPTH_8U, 3);cvZero(img);int right = 40, bottom = 20, top = 5, left = 20;for (; top <= bottom; top++){*(cvPtr2D(img, top, left , NULL) + 1) = 255;*(cvPtr2D(img, top, right, NULL) + 1) = 255;}top = 5;for (; left <= right; left++){*(cvPtr2D(img, top, left, NULL) + 1) = 255;*(cvPtr2D(img, bottom, left, NULL) + 1) = 255;}cvNamedWindow("test", CV_WINDOW_AUTOSIZE);cvShowImage("test", img);cvWaitKey();return 0; }
這樣運行之后,會是下面的結果:
這下就沒問題了~
轉載于:https://www.cnblogs.com/sixfancy/p/3482680.html
總結
以上是生活随笔為你收集整理的《学习OpenCV》第三章习题 第3题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 黄山风景区离上海有多远
- 下一篇: 库存事务处理现有量检查