Noteide
如下內容來自於Bradski和Kaehler的大做: Learning OpenCV 。svn
想一想金字塔爲一層一層的圖像,層級越高,圖像越小。函數
每一層都按從下到上的次序編號, 層級 (表示爲
尺寸小於層級
(
))。學習
爲了獲取層級爲 的金字塔圖像,咱們採用以下方法:測試
將 與高斯內核卷積:ui
將全部偶數行和列去除。spa
顯而易見,結果圖像只有原圖的四分之一。經過對輸入圖像 (原始圖像) 不停迭代以上步驟就會獲得整個金字塔。code
以上過程描述了對圖像的向下採樣,若是將圖像變大呢?:orm
這兩個步驟(向下和向上採樣) 分別經過OpenCV函數 pyrUp 和 pyrDown 實現, 咱們將會在下面的示例中演示如何使用這兩個函數。
Note
咱們向下採樣縮小圖像的時候, 咱們實際上 丟失 了一些信息。
本教程的源碼以下,你也能夠從 這裏 下載
#include "opencv2/imgproc/imgproc.hpp" #include "opencv2/highgui/highgui.hpp" #include <math.h> #include <stdlib.h> #include <stdio.h> using namespace cv; /// 全局變量 Mat src, dst, tmp; char* window_name = "Pyramids Demo"; /** * @函數 main */ int main( int argc, char** argv ) { /// 指示說明 printf( "\n Zoom In-Out demo \n " ); printf( "------------------ \n" ); printf( " * [u] -> Zoom in \n" ); printf( " * [d] -> Zoom out \n" ); printf( " * [ESC] -> Close program \n \n" ); /// 測試圖像 - 尺寸必須能被 2^{n} 整除 src = imread( "../images/chicky_512.jpg" ); if( !src.data ) { printf(" No data! -- Exiting the program \n"); return -1; } tmp = src; dst = tmp; /// 建立顯示窗口 namedWindow( window_name, CV_WINDOW_AUTOSIZE ); imshow( window_name, dst ); /// 循環 while( true ) { int c; c = waitKey(10); if( (char)c == 27 ) { break; } if( (char)c == 'u' ) { pyrUp( tmp, dst, Size( tmp.cols*2, tmp.rows*2 ) ); printf( "** Zoom In: Image x 2 \n" ); } else if( (char)c == 'd' ) { pyrDown( tmp, dst, Size( tmp.cols/2, tmp.rows/2 ) ); printf( "** Zoom Out: Image / 2 \n" ); } imshow( window_name, dst ); tmp = dst; } return 0; }
讓咱們來回顧一下本程序的整體流程:
裝載圖像(此處路徑由程序設定,用戶無需將圖像路徑看成參數輸入)
/// 測試圖像 - 尺寸必須能被 2^{n} 整除 src = imread( "../images/chicky_512.jpg" ); if( !src.data ) { printf(" No data! -- Exiting the program \n"); return -1; }
建立兩個Mat實例, 一個用來儲存操做結果(dst), 另外一個用來存儲零時結果(tmp)。
Mat src, dst, tmp; /* ... */ tmp = src; dst = tmp;
建立窗口顯示結果
namedWindow( window_name, CV_WINDOW_AUTOSIZE ); imshow( window_name, dst );
執行無限循環,等待用戶輸入。
while( true ) { int c; c = waitKey(10); if( (char)c == 27 ) { break; } if( (char)c == 'u' ) { pyrUp( tmp, dst, Size( tmp.cols*2, tmp.rows*2 ) ); printf( "** Zoom In: Image x 2 \n" ); } else if( (char)c == 'd' ) { pyrDown( tmp, dst, Size( tmp.cols/2, tmp.rows/2 ) ); printf( "** Zoom Out: Image / 2 \n" ); } imshow( window_name, dst ); tmp = dst; }
若是用戶按 ESC 鍵程序退出。 此外,它還提供兩個選項:
向上採樣 (按 ‘u’)
pyrUp( tmp, dst, Size( tmp.cols*2, tmp.rows*2 )
函數 pyrUp 接受了3個參數:
向下採樣(按 ‘d’)
pyrDown( tmp, dst, Size( tmp.cols/2, tmp.rows/2 )
相似於 pyrUp, 函數 pyrDown 也接受了3個參數:
注意輸入圖像的大小(在兩個方向)必須是2的冥,不然,將會顯示錯誤。
最後,將輸入圖像 tmp 更新爲當前顯示圖像, 這樣後續操做將做用於更新後的圖像。
tmp = dst;