發表文章

目前顯示的是有「OpenCV」標籤的文章

打包好OpenCV2的Visual C++ 2017專案

這是打包好的OpenCV Visual C++ 2017專案,內含OpenCV 2.4.13版本,可用於Visual C++ 2017 15.6.2版本。和 之前提供下載的VC++2010專案 一樣,使用static library,編譯完成的執行檔案較大,但是不需要額外的DLL即可運行。 更新的部分 1. 更新OpenCV至2.4.13版本以便讓VC2017編譯 2. 更新Header目錄:專案屬性→一般→VC++目錄→Include目錄 3. 更新Library目錄:專案屬性→一般→VC++目錄→程式庫目錄 4. 更新Linker的其他相依性:專案屬性→連結器→輸入→其他相依性 5. 加入x64 Release/Debug編譯選項 內容物 VC++專案檔在MyProgram\MyProgram.sln 執行檔會產生在MyProgram\bin內 Header檔案在OpenCV\include\opencv,OpenCV\include\opencv2 Library檔案在OpenCV\x86和Opencv\x64 下載(GoogleDrive) 編譯Release版本用靜態函數庫 IlmImf.lib libjasper.lib libjpeg.lib libpng.lib libtiff.lib opencv_calib3d2413.lib opencv_contrib2413.lib opencv_core2413.lib opencv_features2d2413.lib opencv_flann2413.lib opencv_gpu2413.lib opencv_highgui2413.lib opencv_imgproc2413.lib opencv_legacy2413.lib opencv_ml2413.lib opencv_nonfree2413.lib opencv_objdetect2413.lib opencv_ocl2413.lib opencv_photo2413.lib opencv_stitching2413.lib opencv_superres2413.lib opencv_ts2413.lib opencv_video2413.lib openc...

Ubuntu上開發OpenCV C++程式

安裝開發套件 sudo apt-get install libopencv-dev python-opencv 手動編譯程式 參考這篇 http://stackoverflow.com/questions/23162399/linking-opencv-libraries-with-g 指令會是 g++ test.cpp  $(pkg-config --libs --cflags opencv) -o test 這是用pkg-config列出安裝的開發套件資訊, pkg-confif --cflags opencv會印出 -I/usr/include/opencv 這是gcc用的設定include目錄option,確實我們可以在目錄下找到opencv.hpp,完整路徑是/usr/include/opencv2/opencv.hpp。而pkg-config --libs opencv會印出 /usr/lib/x86_64-linux-gnu/libopencv_calib3d.so /usr/lib/x86_64-linux-gnu/libopencv_contrib.so /usr/lib/x86_64-linux-gnu/libopencv_core.so /usr/lib/x86_64-linux-gnu/libopencv_features2d.so /usr/lib/x86_64-linux-gnu/libopencv_flann.so /usr/lib/x86_64-linux-gnu/libopencv_gpu.so /usr/lib/x86_64-linux-gnu/libopencv_highgui.so /usr/lib/x86_64-linux-gnu/libopencv_imgproc.so /usr/lib/x86_64-linux-gnu/libopencv_legacy.so /usr/lib/x86_64-linux-gnu/libopencv_ml.so /usr/lib/x86_64-linux-gnu/libopencv_objdetect.so /usr/lib/x86_64-linux-gnu/libopencv_ocl.so /usr/lib/x86_64-linux-gnu/libope...

在Ubuntu開發OpenCV Python程式

Ubuntu安裝 python2的OpenCV 套件 sudo apt-get install python-numpy python-opencv  顯示test.jpg圖片 , 如果有參數,就用參數上的圖片 #!/usr/bin/python import sys import os.path import cv2 if __name__ == '__main__':     win_name = "Image Window"     img_path = "test.jpg"     argc = len(sys.argv)     if argc > 1:         img_path = sys.argv[1]     if not os.path.exists(img_path):         print 'File not found, path=\'', img_path, '\''         quit(-1)     print 'Show the image in the path=\'', img_path, '\''     img = cv2.imread(img_path)     if img is None:         print 'Not supported image type!'         quit(-1)     cv2.namedWindow(win_name)     cv2.imshow(win_name, img)     cv2.waitKey(0)     cv2.destroyAllWindows() Ope...

包好OpenCV的Visual C++ 2010專案下載

為了簡化使用OpenCV的難度,我這裡提供容量較大,但是已經設定好的VC++2010專案給大家下載 https://drive.google.com/file/d/0B3FjKYpOGFCRRzkwcks0YWxBaUE 若需要VC++專案的設定教學,請Google "OpenCV" "VC++", 網路上有很多清楚的圖文說明該如何設定VC++專案,這裡就不綴述了 。

使用OpenCV畫RGB平面的分佈圖

圖片
這隻程式會讀取你指定的圖片,產生分別顯示紅,藍,綠3個平面的強度分佈圖, 使用的方法是用plot這個函數來手動產生繪製分佈圖的image 其實在官方文件中有提到怎麼畫出分佈圖 http://docs.opencv.org/doc/tutorials/imgproc/histograms/histogram_calculation/histogram_calculation.html 下面的程式的結果會類似這樣 #define _CRT_SECURE_NO_WARNINGS  // disable warnings for safe : fopen #define _USE_MATH_DEFINES #include <iostream> #include <opencv.hpp> // C++ version #include <cv.h>  // C version #include <Windows.h> #include <sstream> using namespace std; using namespace cv; // from C++ version template<typename T> void plot(string winname, T* data, int len, Scalar color=CV_RGB(0,0,255), unsigned int plot_height = 480, unsigned int plot_width = 640) {   double max_val;   double min_val;   double h_scale_factor;   double w_scale_factor;   int bnd_space = 20;   T *itr = data, *end = data+len;   Mat img;   Point prev_pt, curr_pt;   if (data==NULL || len<0) ...

Visual C++使用OpenCV讀取影片

這隻程式僅提供讀取功能, 寫入 影片檔案可以參考 http://docs.opencv.org/doc/tutorials/highgui/video-write/video-write.html #define _CRT_SECURE_NO_WARNINGS  // disable warnings for safe : fopen #include <iostream> #include <opencv.hpp> // C++ version #include <cv.h>  // C version using namespace std; using namespace cv; // from C++ version int main(int argc, char** argv) {   string video_path = argc>1?argv[1]:"intelligentroom_raw.avi";   // get cam feed and show in new window   VideoCapture cap(video_path.c_str());   if (!cap.isOpened())   {     cerr << "Cannot open the video file" << endl;     cerr << "Path=" << video_path << endl;     return -1;   }   int width     = (int)cap.get(CV_CAP_PROP_FRAME_WIDTH);   int height    = (int)cap.get(CV_CAP_PROP_FRAME_HEIGHT);   int numframe  = (int)cap.get(CV_CAP_PROP_FRAME_COUNT); ...

使用OpenCV常見的問題

OpenCV官方有很多說明 http://docs.opencv.org/doc/user_guide/ug_mat.html#basic-operations-with-images Mat設定初始值 Mat img(H, W, CV_8UC3, Scalar(255,0,255)); //建立的時候給初始值 img = 0; // 單Channel的圖片可以用這個初始化成0, 多Channel的請用第四種 img = Scalar(0);  img = Scalar(255,0,255); // 粉紅色(參數順序是B,G,R) img = CV_RGB(255,0,255); // 參數順序是R,G,B 灰階圖轉成彩色圖 拷貝Mat內容 Mat img1 = img.clone(); 或是 Mat img1; img.copyTo(img1); 將Mat轉成IplImage // 記得include cv.h,  opencv.hpp // 且要 記得using namespace cv; // 因為Mat轉過來的cv1_img是結構變數, 不是指標變數指到這個結構,  // 所以在丟進去opencv的函數時,要加上&讓結構變數變成指標可以指到的位置 IplImage cv1_img = image; cvShowImage("CV1", &cv1_img);                                 cvWaitKey(0); // 覺得有這種每次都要加上&的用法很麻煩, 就再宣告一個指標變數, 指在前面的這個結構變數上 // 之後就只用這個 指標變數來作處理。 IplImage* ptr_cv1_img = &cv1_img; cvShowImage("CV1 ptr", ptr_cv1_img); cvWaitKey...

Visual C++使用OpenCV顯示圖片

顯示圖片使用的是imshow 函數,OpenCV會建立一個視窗只顯示你給他的圖片 參數1是給視窗的標題,參數2是想要顯示的圖片 顯示之後我們還會加上 waitKey 函數,因為如果只是顯示完圖片,馬上程式就結束了, 我們也就看不到圖片長怎樣了,所以用waitKey讓程式暫停一下。 另外,可以用 namedWindow 函數讓顯示圖片的視窗可以被縮放, 雖然用 CV_WINDOW_NORMAL 可以讓視窗縮放,但是沒有等比例放大,所以實際在觀察圖片的時候要多多留意! 一個例子顯示2倍大的圖片   namedWindow("Original Color Image", CV_WINDOW_NORMAL); // 讓視窗可以被調整   imshow("Original Color Image", image);   resizeWindow("Original Color Image", image.cols*2, image.rows*2); // 讓視窗變大 下面是顯示圖片的範例程式碼 #include #include using namespace std; using namespace cv; int main(int argc, char** argv) {   Mat image;   try   {          if (argc > 1)     {       image = imread(argv[1], CV_LOAD_IMAGE_COLOR);     }     else     {       image = imread("image.bmp", CV_LOAD_IMAGE_COLOR);     }   }   catch (Exceptio...

VC++使用OpenCV讀取圖片

OpenCV可以支援的圖檔格式很多,但不是所有格式,常見的BMP,JPG,PNG都是沒有問題的,其他可讀取 的圖檔格式要查官方網站的說明。 OpenCV讀取圖片使用imread函數,第一個參數是圖片的路徑,第二個是圖片讀進來的樣貌。 如果用CV_LOAD_IMAGE_GRAYSCALE就是獲得灰階圖,得到的Mat的Type會是單Channel的CV_8U 如果用CV_LOAD_IMAGE_COLOR就是獲得彩色圖,得到的Mat的Type會是三個Channel的CV_8UC3 一般我們在imread之後會檢查是否有將圖片讀取近來, 因為只要圖片讀取失敗, 就會讓後面的處理當機,所以 讀取失敗記得要讓程式顯示錯誤唷! 或是用exit函數直接結束程式 //讀圖失敗的判斷寫法1 if (! image.data ) //讀圖失敗的判斷寫法2 if (image.data == NULL) 下面是範例程式碼 #include <iostream > #include  < opencv.hpp > using namespace std; using namespace cv; int main(int argc, char** argv) {   Mat image;   try   {     if (argc  >  1)     {       image = imread(argv[1], CV_LOAD_IMAGE_COLOR);     }     else     {       image = imread("image.bmp", CV_LOAD_IMAGE_COLOR);     }   }   catch (Exception& e)   { ...

字串格式化輸出範例

C的格式化輸出範例 C的格式化輸出只要懂了就會覺得很簡單,好用,強大,只差沒 支援 物件 首先需要引入 #include <stdio.h> 並且視情況需要引入string.h  如果我想要在數字前面預留0,例如產生001, 002,這種編號, printf("%03d", myint); 印出一個預留10個字元空間,浮點數以下顯示5位數的浮點數,最後加上換行 printf("%10.5f\n", myfloat); 如果你是要印影像的數值,可以用下面這段程式碼改一下, 輸出會滿整齊的 int h,w for (h=0 ; h<20 ; ++h) {   for (w=0 ; w<20 ; ++w)   {     printf("%4d ");   }   printf("\n"); } 另外C提供印到某個空間(Space),或可以說是印到字串的功能,這個功能非常好用, 但是非常危險,許多駭客的溢位攻擊都跟這種有關係,但是我們只是寫學術程式,不用管這麼多。 char mystring_buf[1024]; // 記得必須是靜態陣列或者是有配置空間的char陣列 sprintf( mystring_buf, "i can do anything with vars %10.5f\t %s\n", myfloat, my_string ); 格式化輸出字串另外有一種是可以指定要輸出的字串長度,會使用到這個方法是為了安全性/空間或者是對非null-terminate string "%*.s" 有這個函數之後就可以將兩個或多個字串串接起來,我要寫C的程式就會用它來處理多檔案與目錄的問題! C++的格式化輸出範例 C++的格式化輸出比起C來的麻煩,但是比較不容易造成錯誤的輸出 格式速查表 首先會需要引入 #include  < iomanip > 設定輸出寬度為10,文字置左,...