一个系统中同时使用VC6.0+OpenCV1.0和VS2010+OpenCV2.4.6.0的方法
From:? http://blog.csdn.net/zzy7222872/article/details/6047446
以前用的是VC6.0+OpenCV1.0的組合,一直用的很好。一般的圖像處理算法都可以實現,現在突然想搞一下立體視覺方面的東西,查看了OpenCV的手冊,發現立體視覺上的大部分函數只有OpenCV1.0以上版本才有。于是乎準備鳥槍換炮上OpenCV2.0,一查資料,發現OpenCV2.0不能再VC6.0下跑,于是乎只好裝VS2005,但是又怕裝了以后和原來的VC6.0沖突,導致以前的工程都不能用。上網查了資料說裝在不同路徑下是沒問題的。于是大膽安裝在其他目錄下,裝好后果然不沖突,看來只要路徑不同就沒問題,微軟的工程師也不是菜鳥啊。接下來搞定OpenCV2.0,我想在能用原來1.0版本的情況下也可以用2.0的版本,于是將OpenCV2.0裝在了和原來版本不同的目錄下,裝完Ok,沒有問題。接下來是配置。OpenCV2.0的配置沒有原來1.0的簡單,需要自己下載CMAKE來產生需要的dll和lib文件。一下參考了一篇帖子如下。
1.Opencv2.0下載地址:
http://www.opencv.org.cn/index.php/Download
安裝時選擇默認路徑,安裝后檢查C:/OpenCV2.0/bin
是否已經被加入到環境變量PATH,如果沒有,請加入。
加入后需要注銷當前Windows用戶(或重啟)后重新登陸才生效。
2.配置IDE,打開VS2005,選擇菜單:Tools -> Options,在彈出窗口中選擇
Projects and Solutions -> VC++ Directories
首先,從“Show Directories for”的list box中選擇“Include files”,
添加路徑“C:/OpenCV2.0/include/opencv”。
3.添加庫文件(library files),需要下載CMAKE,用來生產所需的庫文件,cmake下載地址:
http://www.cmake.org/cmake/resources/software.html
打開cmake-gui。在第一個路徑處選擇opencv的安裝路徑,記得是CMakeLists.txt所在的那個路徑。
第二個路徑是 make得到的工程保存位置。
點擊Configure并選擇合適的編譯器。選擇完編譯器之后需點擊Configure兩次,
最后點擊Generate生成我們想要的工程文件(.lib? .dll)。
4.打開make得到的工程保存位置中的OpenCV.sln文件,build solution后在工程目錄下得到bin和lib的文件夾,
將bin/debug中的.dll文件復制到C:/OpenCV2.0/bin,將lib/debug中的.lib文件復制到C:/OpenCV2.0/lib,
5.添加庫文件(library files),選擇菜單:Tools -> Options,在彈出窗口中
選擇Projects and Solutions -> VC++ Directories,首先,從“Show Directories for”的list box中
選擇“Library files”,添加路徑“C:/OpenCV2.0/lib”。選擇“source files”,
添加路徑“C:/OpenCV2.0/src/cv”,“C:/OpenCV2.0/src/cvaux”,“
C:/OpenCV2.0/src/cxcore”,“C:/OpenCV2.0/src/highgui”,“C:/OpenCV2.0/src/ml”。
6.建立project后要設置項目所需要的lib,
選擇菜單Project -> Properties -> Configuration Properties -> Linker -> Input,
在additional dependencies中加入cxcore.lib cv.lib ml.lib cvaux.lib highgui.lib等需要的庫。
注意加入的庫文件要和第3步生成的文件名一致,假如在第3步中選擇VS2005的編譯器時,
生成的文件名含有200d(不知道其他的編譯器會不會),此時加入的庫文件應該
是cxcore200d.lib cv200d.lib ml200d.lib cvaux200d.lib highgui200d.lib。
每次新建一個project都要添加項目所需的lib。
按上面的提示配置完后拷貝了以OpenCV中文論壇上的2.0版本的helloworld程序,發現有fatal error C1010: unexpected end of file while looking的錯誤,?查了下是預編譯頭的問題,解決方法是在設置那C/C++的Category的選項框選擇Precompiled Headers 然后再選擇Not using precompiled headers,這樣再編譯一下,Ok通過。運行一下,終于看到了經典的lena照片。
現在情況如下,我在VC6.0平臺下使用OpenCV1.0庫,在VS2005下使用OpenCV2.0庫,暫時運行正常,沒有沖突。寫段文章總結一下,防止以后忘了,想雙平臺運行的朋友也可以參考一下。如有Bug出現,也希望大家提出來。
=================================================================================
以下為個人整理的內容:
根據參考的那篇博文說:需要自己下載CMake來產生需要的dll和lib文件!
但是我是從網上下載了OpenCV2.4.6.0, 雙擊解壓后,發現里面有現成的dll和lib文件,可以直接使用,不需要下載CMake來編譯產生dll和lib文件。
下面的源代碼來自http://docs.opencv.org/doc/tutorials/introduction/windows_visual_studio_Opencv/windows_visual_studio_Opencv.html
本人實現了下,環境:vc2010 + OpenCV2.4.6.0
/*環境:winXP + vc2010 + OpenCV2.4.6.0(http://jaist.dl.sourceforge.net/project/opencvlibrary/opencv-win/2.4.6/OpenCV-2.4.6.0.exe)OpenCV2.4.6.0安裝目錄:D:\opensource\opencv1. 添加頭文件所在目錄:D:\opensource\opencv\modules\core\includeD:\opensource\opencv\modules\imgproc\includeD:\opensource\opencv\modules\highgui\include注:以上三個目錄可用“D:\opensource\opencv\build\include”一個代替!2. 添加lib文件所在目錄:D:\opensource\opencv\build\x86\vc10\lib3. 為項目添加使用到的lib文件:opencv_core246d.lib;opencv_imgproc246d.lib;opencv_highgui246d.lib;配置完成,編譯成功!運行時,可能會出現提示:缺少xxx.dll,這時只要將相關dll復制到可執行程序同一目錄或將dll所在目錄加入到Path環境變量中!我采取的是將“D:\opensource\opencv\build\x86\vc10\bin”加入到Path環境變量中!再次運行,OK! */// Video Image PSNR and SSIM #include <iostream> // for standard I/O #include <string> // for strings #include <iomanip> // for controlling float print precision #include <sstream> // string to number conversion#include <opencv2/imgproc/imgproc.hpp> // Gaussian Blur #include <opencv2/core/core.hpp> // Basic OpenCV structures (cv::Mat, Scalar) #include <opencv2/highgui/highgui.hpp> // OpenCV window I/Ousing namespace std; using namespace cv;double getPSNR ( const Mat& I1, const Mat& I2); Scalar getMSSIM( const Mat& I1, const Mat& I2);static void help() {cout<< "\n--------------------------------------------------------------------------" << endl<< "This program shows how to read a video file with OpenCV. In addition, it tests the"<< " similarity of two input videos first with PSNR, and for the frames below a PSNR " << endl<< "trigger value, also with MSSIM."<< endl<< "Usage:" << endl<< "./video-source referenceVideo useCaseTestVideo PSNR_Trigger_Value Wait_Between_Frames " << endl<< "--------------------------------------------------------------------------" << endl<< endl; } int main(int argc, char *argv[]) {help();if (argc != 5){cout << "Not enough parameters" << endl;return -1;}stringstream conv;const string sourceReference = argv[1], sourceCompareWith = argv[2];int psnrTriggerValue, delay;conv << argv[3] << argv[4]; // put in the stringsconv >> psnrTriggerValue >> delay;// take out the numberschar c;int frameNum = -1; // Frame counterVideoCapture captRefrnc(sourceReference), captUndTst(sourceCompareWith);if ( !captRefrnc.isOpened()){cout << "Could not open reference " << sourceReference << endl;return -1;}if( !captUndTst.isOpened()){cout << "Could not open case test " << sourceCompareWith << endl;return -1;}Size refS = Size((int) captRefrnc.get(CV_CAP_PROP_FRAME_WIDTH),(int) captRefrnc.get(CV_CAP_PROP_FRAME_HEIGHT)),uTSi = Size((int) captUndTst.get(CV_CAP_PROP_FRAME_WIDTH),(int) captUndTst.get(CV_CAP_PROP_FRAME_HEIGHT));if (refS != uTSi){cout << "Inputs have different size!!! Closing." << endl;return -1;}const char* WIN_UT = "Under Test";const char* WIN_RF = "Reference";// WindowsnamedWindow(WIN_RF, CV_WINDOW_AUTOSIZE );namedWindow(WIN_UT, CV_WINDOW_AUTOSIZE );cvMoveWindow(WIN_RF, 400 , 0); //750, 2 (bernat =0)cvMoveWindow(WIN_UT, refS.width, 0); //1500, 2cout << "Frame resolution: Width=" << refS.width << " Height=" << refS.height<< " of nr#: " << captRefrnc.get(CV_CAP_PROP_FRAME_COUNT) << endl;cout << "PSNR trigger value " <<setiosflags(ios::fixed) << setprecision(3) << psnrTriggerValue << endl;Mat frameReference, frameUnderTest;double psnrV;Scalar mssimV;for(;;) //Show the image captured in the window and repeat{captRefrnc >> frameReference;captUndTst >> frameUnderTest;if( frameReference.empty() || frameUnderTest.empty()){cout << " < < < Game over! > > > ";break;}++frameNum;cout <<"Frame:" << frameNum;/ PSNR psnrV = getPSNR(frameReference,frameUnderTest); //get PSNRcout << setiosflags(ios::fixed) << setprecision(3) << psnrV << "dB";MSSIM /if (psnrV < psnrTriggerValue){mssimV = getMSSIM(frameReference,frameUnderTest);cout << " MSSIM: "<< "R" << setiosflags(ios::fixed) << setprecision(3) << mssimV.val[2] * 100<< "G" << setiosflags(ios::fixed) << setprecision(3) << mssimV.val[1] * 100<< "B" << setiosflags(ios::fixed) << setprecision(3) << mssimV.val[0] * 100;}cout << endl;// Show Image /imshow( WIN_RF, frameReference);imshow( WIN_UT, frameUnderTest);c = (char)cvWaitKey(delay);if (c == 27) break;}return 0; }double getPSNR(const Mat& I1, const Mat& I2) {Mat s1;absdiff(I1, I2, s1); // |I1 - I2|s1.convertTo(s1, CV_32F); // cannot make a square on 8 bitss1 = s1.mul(s1); // |I1 - I2|^2Scalar s = sum(s1); // sum elements per channeldouble sse = s.val[0] + s.val[1] + s.val[2]; // sum channelsif( sse <= 1e-10) // for small values return zeroreturn 0;else{double mse =sse /(double)(I1.channels() * I1.total());double psnr = 10.0*log10((255*255)/mse);return psnr;} }Scalar getMSSIM( const Mat& i1, const Mat& i2) {const double C1 = 6.5025, C2 = 58.5225;/***************************** INITS **********************************/int d = CV_32F;Mat I1, I2;i1.convertTo(I1, d); // cannot calculate on one byte large valuesi2.convertTo(I2, d);Mat I2_2 = I2.mul(I2); // I2^2Mat I1_2 = I1.mul(I1); // I1^2Mat I1_I2 = I1.mul(I2); // I1 * I2/*************************** END INITS **********************************/Mat mu1, mu2; // PRELIMINARY COMPUTINGGaussianBlur(I1, mu1, Size(11, 11), 1.5);GaussianBlur(I2, mu2, Size(11, 11), 1.5);Mat mu1_2 = mu1.mul(mu1);Mat mu2_2 = mu2.mul(mu2);Mat mu1_mu2 = mu1.mul(mu2);Mat sigma1_2, sigma2_2, sigma12;GaussianBlur(I1_2, sigma1_2, Size(11, 11), 1.5);sigma1_2 -= mu1_2;GaussianBlur(I2_2, sigma2_2, Size(11, 11), 1.5);sigma2_2 -= mu2_2;GaussianBlur(I1_I2, sigma12, Size(11, 11), 1.5);sigma12 -= mu1_mu2;/ FORMULA Mat t1, t2, t3;t1 = 2 * mu1_mu2 + C1;t2 = 2 * sigma12 + C2;t3 = t1.mul(t2); // t3 = ((2*mu1_mu2 + C1).*(2*sigma12 + C2))t1 = mu1_2 + mu2_2 + C1;t2 = sigma1_2 + sigma2_2 + C2;t1 = t1.mul(t2); // t1 =((mu1_2 + mu2_2 + C1).*(sigma1_2 + sigma2_2 + C2))Mat ssim_map;divide(t3, t1, ssim_map); // ssim_map = t3./t1;Scalar mssim = mean( ssim_map ); // mssim = average of ssim mapreturn mssim; }總結
以上是生活随笔為你收集整理的一个系统中同时使用VC6.0+OpenCV1.0和VS2010+OpenCV2.4.6.0的方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: J2EE开发技术点4:ajax技术
- 下一篇: PE启动盘安装操作系统