前面說了一堆,也不知道啥用,感覺也沒說清楚,可能確實需要一些例子來顯性表示一下,或者他們在當初出版書籍針對的人群已經有了對圖像的基本認識,然而自己還是沒有建立起來,往后看看吧,希望能比較清楚的自己處理一些圖像,知道一些如是能對某個像素的某個通道的值進行改變那么很多問題就變得簡單,我想,開始的例子應該也是這里,但是沒有所見即所得的即觸感,感覺……很生硬。
例3-12這個例子也很坑,
所以自己簡單整理了一下。
要輸入7個參數。這個對於c c++的要求還是比較高的。atoi函數也比較高級。所以能不能繼續像前面一樣,把例程跑起來,然后在例程的基礎之上完成對知識點的講解。
先上例程:
#include "highgui.h" #include "cv.h" int main(){ IplImage* src; src = cvLoadImage("1.png"); cvNamedWindow("e3", 1);//0是可變大小,1是固定大小且與內容適配 int x = 100; int y = 100; int width = 50; int height = 50; int add = 100; cvSetImageROI(src, cvRect(x, y, width, height)); cvAddS(src, cvScalar(add), src); cvResetImageROI(src); cvShowImage("e3", src); cvWaitKey(0); return 0; }
這樣做的好處是,避免了到cmd命令行中,手敲內容。少了很多的學習代價,比如每次看到主函數參數,就很讓人頭疼。所以這里面又把不相干的去掉了,如果為了得到書上的代碼可以參考這個同學的筆記:
http://blog.csdn.net/shangyt/article/details/5747017
然后不小心看到回復了,發現這樣做還是有點兒必要的。
首先要保證運行目錄下面有1.png.然后直接執行就可以了:
的確是有一個小籃矩形。
根據前面的學習經驗,這里需要理解的就只是cvSetImageROI(src, cvRect(x, y, width, height));
cvAddS(src, cvScalar(add), src); cvResetImageROI(src); 這三行,書上又描述了cvSetImageROI和 cvResetImageROI() 所以不理解的就只有cvAddS()了。
從函數的名字大概知道是計算機視覺設置圖片ROI 跟重置圖片ROI。然后傳參數就可以了。那么ROI:(這書上也沒給,倒是給了個相近的概念COI,所以還是母語是英語有點兒好處的,要不然人家的東西就看不懂,所以換句話說,如果我們足夠發達在某些地方占有一席之地,然后我們也做了很多需要別人學的內容,這樣別人會感慨要是母語是漢語就好了。)好了ROI是region of interest;COI是Channel of interest。分別代表感興趣區域,感興趣通道。嗯,其實就是側重區域,跟側重通道。對於一整幅圖像來說,/*【看看之前發的fps的相關內容,就知道,】比如1920*1080的。就是這么多個像素點。picture Element 簡寫作 pixel。每個顏色有RGB加和而成。假設每個顏色是8位,0-255。也就是一個點要3個字節。所以一共是1920*1080*3個字節,要看電影每秒要24幀。才能讓靜態播放的圖片讓人感覺起來不卡頓。也就是每秒要處理1920*1080*3*24個字節,這還只是理論上實際上要更大。有的顯示器可能液晶的每秒是60幀,陰極射線管(CRT)要到每秒75幀以上,打游戲肯定不能滿足於每秒24幀,打個lol怎么也要到60fps(frames per second),所以處理的數據量是十分巨大的,所以在有了cpu之后圖像太費處理器了,干脆就有了gpu,集成顯卡不好使,就又多了獨立顯卡,都是因為圖像的處理十分耗費資源,所以。*/如果能只對某一部分進行處理的話,就會好很多,這樣就出現了側重區域,和側重通道。
上題例程中我們給了一個側重區域,以圖像左上方為原點,水平方向為x軸,沿右側方向為正方向,垂直方向為y軸,向下為正方向。(100,100)點為原點。一個50*50像素的正方形被畫出。這個區域就是我們的感興趣區域。
然后,設想是不是其他形狀的ROI也被支持。按F12
/* Sets image ROI (region of interest) (COI is not changed) */
CVAPI(void) cvSetImageROI( IplImage* image, CvRect rect );
發現只有矩形區域被支持。
然后看增強函數;這個cvAddS(src,cvScalar(add),src);
然后開始試這幾個參數:
發現 分別是bgr,最后一個參數,不得而知,難道是透明度?好像不是,先不管。總之前面幾個都是顏色的不同通道值。
cvAddS(src, cvScalar(-255,-255,-255,0.5), src);
這樣讓目標區域全黑
cvAddS(src, cvScalar(255,255,255,0.5), src);
這樣讓目標區域全白
有了add必然應該有減法,所以看到了sub估計就跑不遠了。
cvSubS(src, cvScalar(255,255,255,0.5), src);
這樣讓目標區域全黑,因為每個通道的值減到0以下,就會按全黑顯示。