發表文章

目前顯示的是有「Visual C-plu-plus」標籤的文章

打包好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...

我的Visual C++設定與調整

圖片
改變程式碼顏色 可以在網路上下載VC++的theme,副檔名是vssettings, 例如可以下載我正在用的  https://studiostyl.es/schemes/son-of-obsidian 在VC++找選單的"工具"→匯入與匯出設定→匯入選取的環境設定→ 只需會匯入新設定並覆寫目前設定 →按下面的"瀏覽"按鈕,選 擇剛剛下載的vssettings檔案 →完成 因為這是直接覆寫的作法,所以設定都會跑掉,可以參考下面的設定把你喜歡的設定調整回來 設定程式碼字型大小 我的習慣是用等寬字形,例如Consolas,然後以一整面可以看30行以上的程式碼為原則來設定字型大小,一般我設12 或14。 設定Tab(定位點)長度 我的習慣是Tab長度為2,縮排大小為2,按Tab(定位點)全部改成空白鍵。 顯示行號

包好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...

Visual C++快捷鍵

F1 顯示說明 F2 在專案管理下點選檔案或資料夾時,可更改檔案名稱。 F3 F5 編譯並開始偵錯 Ctrl+F5 編譯並執行 ( 執行結束會出現請按任意繼續,並且有時候無法DEBUG ) F7 建置 Solution Ctrl+Alt+F7 重建 Solution Ctrl+F7 編譯 Ctrl+Shift+B F9 插入中斷點 F10 單步執行 F11 單步執行  &  進入副程式 F12 移至定義 TAB 選取的程式碼,往右增加排縮 Shift+TAB  網左減少排縮 Ctrl+TAB 切換分頁 Ctrl+K 後 Ctrl+C 建立區塊註解 Ctrl+K,U  取消所選擇的區塊註解 Alt+ 滑鼠選取 區塊選取文字 / 程式碼(一般狀況不會用到) Ctrl + H 取代文字 Ctrl + I 遞增搜尋 Ctrl + F 尋找文字。另外用 F3可尋找下一筆,用 Shift + F3可 尋找上一筆 Ctrl + Shift + F 在檔案中尋找 Ctrl + Shift + H 在檔案中取代 Ctrl+K+F 格式化整個塊 Ctrl+K 後 Ctrl+D 格式化整篇代碼 Ctrl+B+T 設置書簽 Ctrl+B+N 跳轉書簽 Ctrl +] 檢查括弧匹配 ( 在左右括弧間切換 ) Home 游標移動到行頭 End 游標移動到行尾 Ctrl+F4 關閉目前檔案分頁

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)   { ...

Windows程式內如何取得Command line參數?

可以使用 GetCommandLine()來取得Command line參數,下面一個簡易範例。   int argc;   char** argv = CommandLineToArgv(GetCommandLine(), argc);   string img_path = argc>1?argv[1]:" ";   delete[] argv[0]; // 使用完要刪除   delete[] argv; // 使用完要刪除 因為微軟的SDK只有提供寬字元版的 CommandLineToArgvW,所以我花了點時間寫一般字元的版本, 這個處理並不包含參數中間內有雙引號的情況,不過參數的頭尾是雙引號有做,所以某些參數可能跟系統的不太一樣。 我使用的是狀態機的作法,因為這樣比較容易發想與處理,用一張圖就可以搞定想法與實作。 第一次掃描將空白符號與不必要的符號都設為'\0',並獲得參數數目 argc。 第二次掃描將資料設定到argv中,因為第一次掃描已經將不必要的符號都設為'\0'所以可以用簡便的方法處理argv char** CommandLineToArgv(char* sys_cmd, int& argc) {   int  curr_state;   char **argv, **argv_itr;   char *cmd_itr, *loc;   int   cmd_len = strlen(sys_cmd);   char *cmd     = new char[cmd_len+1];   char *cmd_end = cmd+cmd_len;      strncpy(cmd, sys_cmd, cmd_len);   cmd[cmd_len] = '\0';      argc = 0;   curr_state = 0;   for (cmd_itr=cmd ...

命令提示字元呼叫VC++的editbin

使用到的editbin,如果沒有用,新手在寫這種批次檔的時候會遭遇問題 從捷徑裡面可知道實際上是呼叫 然後看這些批次檔中 "C:\Program Files (x86)\Microsoft Visual Studio 9.0\Common7\Tools\vsvars32.bat" call "C:\Program Files (x86)\Microsoft Visual Studio 9.0\Common7\Tools\vsvars32.bat" x86 editbin /LARGEADDRESSAWARE myapp.exe

Windows XP的程式使用大於2GB的記憶體

由於使用BCB開發C++大型圖檔的處理程式時,只要配置到2GB以上的記憶體後,就會產生bad_alloc的例外, 導致無法用BCB處理超大型圖檔。但是,在大學課程中所說的是:32位元的程式能夠使用最多4GB的記憶體, 為何現在只能用2GB?  原來是因為Windows XP與較舊的系統,為了確保OS能夠維持系統運作,將單一程序的記憶體使用量限制在2GB, 如果需要使用大於2GB,就會需要關閉Windows XP的限制。 解除限制的方法分為兩個步驟 1. 設定OS的開機選項中boot.ini的參數 在「我的電腦」右鍵「內容」→切換成「進階」頁面→由上往下第三個「設定」→「編輯」→加入 /3GB的設定 2. 用工具程式對程式進行微調 利用Visual Studio 2008 所提供的工具Editbin做編輯(Express版也有提供) 開啟Visual Studio 2008的命令提示字元鍵入 editbin.exe /LARGEADDRESSAWARE "你的程式路徑" 如此一來,就能夠開始充分利用3GB(for win xp)/4GB(for win 7 64bit)的程式空間 附註:  這個 小工具可以很方便的完成第二個步驟的工作。 參考資料 如何使用 4GT RAM 微調功能 http://support.microsoft.com/kb/297812 關於Win2K Advance Server 中 boot.ini的/PAE /3GB 設定問題 http://social.msdn.microsoft.com/Forums/zh-TW/241/thread/1262d289-2282-4f63-bb2a-e8b0c954d4fc MSDN:Memory Limits for Windows Releases http://msdn.microsoft.com/en-us/library/aa366778(VS.85).aspx How to make Windows XP Pro give more than 2GB of memory to Poser 6 htt...

Windows編譯Libtiff

Wikipedia上寫libtiff並不是www.libtiff.org這個網址,其實講的沒錯,這個網址的軟體更新較慢。 下載原始碼,解壓縮之後將nmake.opt的內容稍微改一下,把OPTFLAGS的部分的/MD取消掉,不然BCB會不能呼叫動態函數庫 如果要支援JPEG、JBIG、LZW就要將這些套件下載回來放到nmake.opt指定的地方,然後將 # 註解的部分解除註解。 編譯方法 開啟Visual Studio 2008命令提示字元→ 進入libtiff解壓縮出來的libtiff資料夾(就是放原始碼和Header檔的東西)→ 鍵入nmake -f makefile.vc all  一般來說應該是會編譯成功。 BCB使用方法 將編譯出來的libtiff_i.lib和libtiff.dll複製到BCB專案目錄底下, 然後用BCB提供的轉lib檔的程式將lib轉為BCB可以用的lib檔案 (其實也是可以用libtiff.lib做靜態連結,可是BCB沒辦法用VC編譯出來的,都要透過轉lib的程式, 但是這支程式只會將Symbol留下,其它的程式資料就會被捨棄,所以只好給BCB使用動態連結) 然後把libtiff的.h檔也都負制到BCB專案中,在程式裡面include tiffio.h,就能使用libtiff的功能了!! 若是出現一大堆關於Tiff函數的Linker 錯誤, 1. 先檢查專案的library path和include path是否有設專案的目錄, 2. 若是1.的方法沒用,就在程式前面加上 #pragma comment(lib, "libtiff_i.lib")  建議編譯器加入libtiff進行連結, 3. 應該沒有第三個可能性了才是, 以上。

WinXP中的執行檔無法使用超過2.7G的記憶體

圖片
!這是在使用XP時找到的解法,可見我閒置多久未發表它了! 當EXE無法使用超過2.7G的記憶體, 可使用Visual Studio提供的系統工具 editbin 來解除WinXP的限制 在命令提示字元底(Command Line)底下輸入指令 editbin /LARGEADDRESSAWARE 指定要修改的EXE執行檔 關於editbin系統程式可以參考MSDN http://msdn.microsoft.com/zh-tw/library/xd3shwhf(v=vs.80).aspx 如果你無法執行editbin,但是你又有裝Visual Studio, 表示你需要使用VS的Command line捷徑來啟用VS系統工具。 例如: Microsoft Visual Studio 2008的Command line捷徑會在 「開始」→「程式集」→「Microsoft Visual Studio 2008」   →「Visual Studio Tools」→「Visual Studio 2008命令提示字元」

Solution: MFC and fatal error C1189

圖片
今天用Visual Studio 2005開一個空白專案,撰寫一個MFC的程式,遭遇了fatal error C1189 錯誤訊息前略... include\afx.h(24) : fatal error C1189: #error : Building MFC application with /MD[d] (CRT dll version) requires MFC shared dll version. Please #define _AFXDLL or do not use /MD[d] 解決方式 調整專案的屬性,將MFC的DLL設定到位 1. 對著專案按右鍵→「屬性」 2. 「組態屬性」.「一般」.「MFC的使用」選擇「使用MFC的共用DLL」或是靜態MFC函式庫

VC++:設定IDE永久的include的header目錄與link的lib目錄

圖片
在 Java:Create .DLL file in VC++ for JNI 的「3. VC++2005的設定」中,引入JNI標頭檔所使用的設定方法,是專案性的設定方式,當你開啟新的專案後,這些設定就不會存在。 若要使編譯環境永遠Include某些標頭檔,或是在Link時加入lib檔一起編譯,就需要設定IDE的選項,將這些設定保留在IDE中,往後開新的專案也都會附帶這些設定。 要設定VC++2005的永久選項,在工具列的「工具(T)」→「選項(0)」中 在左邊的樹狀圖'專案和方案'中,點選'VC++目錄'來設定這些目錄 Include的header目錄 Link的lib目錄 需要設定成為永久性的選項,往往都是程式撰寫者本身所匯聚的的函式庫,可能是自己寫的,也可能是其他人所撰寫的,總而言之,這些函式庫通常就是設計師的手腳。