編譯opencv
『壹』 如何編譯opencv代碼
..\OpenCV2.3\opencv\moles 這個目錄有一些常用的庫,一般演算法的實現是看不到的,通常在靜態庫里,你可以連接他們,生成執行文件。
hpp,其實質就是將.cpp的實現代碼混入.h頭文件當中,定義與實現都包含在同一文件,則該類的調用者只需要include該hpp文件即可,無需再 將cpp加入到project中進行編譯。而實現代碼將直接編譯到調用者的obj文件中,不再生成單獨的虎矗港匪蕃睹歌色攻姬obj,採用hpp將大幅度減少調用 project中的cpp文件數與編譯次數,也不用再發布煩人的lib與dll,因此非常適合用來編寫公用的開源庫。
『貳』 linux 下 opencv程序怎麼編譯
運行了樓上給的命令之後,結果是這樣的:
# g++ `pkg-config opencv --libs --cflags opencv` facedect.cpp -o facedect -static
/tmp/cc8XhRf6.o: In function `find_face(_IplImage*)':
facedect.cpp:(.text+0x51): undefined reference to `cvCreateImage'
facedect.cpp:(.text+0xc0): undefined reference to `cvCreateImage'
facedect.cpp:(.text+0xdd): undefined reference to `cvCvtColor'
facedect.cpp:(.text+0xf7): undefined reference to `cvResize'
facedect.cpp:(.text+0x109): undefined reference to `cvEqualizeHist'
facedect.cpp:(.text+0x116): undefined reference to `cvClearMemStorage'
facedect.cpp:(.text+0x188): undefined reference to `cvHaarDetectObjects'
facedect.cpp:(.text+0x1c6): undefined reference to `cvReleaseImage'
facedect.cpp:(.text+0x1d1): undefined reference to `cvReleaseImage'
/tmp/cc8XhRf6.o: In function `isperson(char const*)':
facedect.cpp:(.text+0x21e): undefined reference to `cvLoad'
facedect.cpp:(.text+0x22f): undefined reference to `cvCreateMemStorage'
facedect.cpp:(.text+0x25a): undefined reference to `cvLoadImage'
facedect.cpp:(.text+0x27d): undefined reference to `cvReleaseImage'
facedect.cpp:(.text+0x289): undefined reference to `cvDestroyWindow'
collect2: ld returned 1 exit status
『叄』 如何重新編譯opencv python
GCC 5.4.0
CMAKE 3.5.1
OpenCV 3.1.0
Android SDK API 23(Android 6.0)
Androird NDK r12b(12.1.2977051)
Python 2.7.12
當然在編譯過程中還會用到很多其他工具和軟體包,比如Ninja,Ant等,我會在文中需要的時候給出它們的版本和安裝方法。
關於GCC,CMAKE和Python的安裝過程本文就不詳述了,一是因為這些工具的安裝過程很容易,網路上的介紹都很詳細,二是因為之前剛剛配置好TensorFlow,安裝了一大堆軟體包,我也不清楚本文的內容究竟會涉及哪些依賴庫,我會盡量把我在編譯過程中所需的工具和庫標記出來。
『肆』 cmake編譯opencv程序的時候怎麼靜態編譯
使用opencv需要編譯源碼,得到庫文件。可以用cmake構建項目後編譯,也可以直接用官方提供的編譯好的版本。 官方提供的編譯庫一般只是標准版本,沒有附加某些庫,比如tbb等,要想讓opencv使用tbb等庫,就只能自己構建項目後編譯。
『伍』 如何用cmake 編譯OpenCV 3.1.0的opencv
用cmake 編譯OpenCV 3.1.0的opencv:
建一個新的文件夾,完整路徑:D:CMakeCMake-StudyHelloCMake,
然後在HelloCMake文件夾里建立一個HelloCMake.cpp文件,裡面的代碼如下:
#include <iostream>
int main()
{
std::cout<<"Study CMake Together - Hello CMake!"<<std::endl;
return 0;
}
然後在HelloCMake文件夾里建立一個CMakeLists.txt文件,注意文件名不能是別的,必須叫這個名字。裡面的內容如下:
cmake_minimum_required(VERSION 2.6)
project(HelloCmake)
add_executable(HelloCMake hellocmake.cpp)
接著在HelloCMake的同級目錄里建立一個新的文件夾,就叫做HelloCMake-bin,在我機子上的完整路徑是:D:CMakeCMake-StudyHelloCMake-bin,你可以針對自己的目錄路徑對號入座。
然後打開CMake程序,接著把包含CMakeLists.txt和HelloCMake.cpp文件的完整路徑給」where is the source code」,把最後建立的HelloCMake-bin目錄的完整路徑給」where to build the binaries」,然後按Cofigure,
Configure完了以後,再按Generate,直到所有的紅色選項都變成灰色為止。然後打開HelloCMake-bin,你會發現原來空的文件夾裡面自動生成了好多文件。
到此為止,工程構建完成,打開HelloCMake-bin目錄下的HelloCMake.sln,裡面有三個工程,分別是:ALL_BUILD;HelloCMake;ZERO_CHECK。這三個工程的大概作用如下(個人理解而已),HelloCMake就不用說了,自己要建立的那個工程;ALL_BUILD是管理整個項目的工程;ZERO_CHECK是實時監視CMakeLists.txt文件變化的工程,一旦CMakeLists.txt里的內容發生了任何變化,ZERO_CHECK就會告訴編譯器要重新構建整個工程環境。所以,你可以先把工程關掉,打開CMakeLists.txt文件,更改裡面的內容以後,把根據以上說的步驟走一遍CMake;你也可以在編譯器環境(如VS2008)中更改CMakeLists.txt文件,然後直接F7編譯工程。如果你選擇後者,你會發現所示的現象發生。
因為你改變了CMakeLists.txt的內容,工程的環境要重新構建、設置。所以你必須載入新的工程環境設置。點Yes,然後點Reload。重新載入設置過的工程環境。
另外一個經常看某些童鞋問的,就是當彈出所示的界面時要怎麼辦?能怎麼辦?界面上提示已經灰常清楚了,指定exe的路徑給它,然後點OK就可以了;出現這種情況的原因是你把沒有生成exe可執行文件的工程設為啟動工程了,你會發現ALL_BUILD這個工程名字是黑體顯示的,表示它是啟動工程;或者你把生成exe可執行文件的工程,如這里的HelloCMake右擊->設置為啟動工程,也不會出現所示的界面。
好,這些比較瑣碎的東西介紹完,我們一起來看看CMakeLists.txt裡面的代碼表示什麼意思,爭取每句代碼都作解釋,如果有不對的地方,一定要告訴我!
把CMakeLists.txt里的內容再羅列出來:
cmake_minimum_required(VERSION 2.6)
2. project(HelloCmake)
3. add_executable(HelloCMake hellocmake.cpp)
第1行,cmake_minimum_required(VERSION 2.6)這是對CMake版本的要求,基本上每個CMakeLists.txt文件里都會有這句代碼,cmake_minimum_required是cmake里的命令,可大寫小寫。VERSION這個關鍵字必須是大寫,而且不能省略;2.6就是CMake的版本號,現在的版本是2.8.3。
第2行,project(HelloCmake),project也是CMake的命令,裡面的參數HelloCMake是你要生成的工程的名字,換句話說就是生成的***.sln或者***.dsw等工程項目文件的名字。
第3行,add_executable(HelloCMake hellocmake.cpp),add_executable同樣是CMake的命令,鏈接有關的源文件,然後生成exe可執行文件,這是這個命令的作用。第一個參數是生成的exe文件的文件名,一般與project里的工程名一致,這樣編譯生成的文件就分別是HelloCMake.sln和HelloCMake.exe,當然也可以不一樣。Add_executable()後面的是一個參數列表,可帶多個要編譯的文件名,中間以空格或回車等隔開,如可以加入:
add_executable(HelloCMake hellocmake.cpp hellocmake.h)
這樣就把CMake里最常用的三個命令介紹完了,分別是cmake_minimum_required; project; add_executable等
『陸』 能配置opencv的編譯軟體有哪些
配置環境是: ubuntu12.04 + opencv2.4.0
安裝OpenCV:
1. 安裝必要的軟體
apt-get install build-essential cmake libgtk2.0-dev pkg-config python-dev python-numpy libavcodec-dev libavformat-dev libswscale-dev
2. 從sourceforge上下載OpenCV的源碼,下載地址是:
http://sourceforge.net/projects/opencvlibrary/files/opencv-unix/2.4.0/
3. 解壓到任意目錄
tar xvf OpenCV-2.4.3.tar.bz2
cd OpenCV-2.4.3/
4. cmake編譯OpenCV源碼,所有的lib文件都會被安裝到/usr/local目錄下
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local
5. 安裝
make
sudo make install
環境變數pkg_config_path 提供編譯時和運行時庫的路徑查詢。pkg-config 是通過庫提供的一個 .pc 文件獲得庫的各種必要信息的,包括版本信息、編譯和鏈接需要的參數等。這些信息可以通過 pkg-config 提供的參數單獨提取出來直接供編譯器和 鏈接器使用。使用 pkg-config 的 --cflags 參數可以給出在編譯時所需要的選項,而 --libs 參數可以給出 鏈接時的選項。
在上述opencv 的安裝結束後,pkg-config 的讀取目錄 /usr/local/lib/pkgconfig/ 下已經有opencv.pc。
6. 更新環境變數:
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig/
編譯程序:
用OpenCV讀入一副圖像(img.jpg),代碼如下:
//main.cpp
#include <stdio.h>
#include <cvaux.h>
#include <highgui.h>
using namespace cv;
int main() {
IplImage *img = cvLoadImage("img.jpg",0);
if (NULL == img) {
printf("Load image failed.\n");
return -1;
}
printf("Hello World\n");
cvReleaseImage(&img);
return 0;
}
方法1:直接命令編譯:
g++ main.cpp -o main `pkg-config --cflags --libs opencv` (注意ESC下面的`,不是單引號)
方法2:藉助cmake,需要寫CMakeLists.txt,示例如下:
cmake_minimum_required(VERSION 2.8)
project(Hello)
find_package(OpenCV REQUIRED)
add_executable(Hello main.cpp)
target_link_libraries(Hello ${OpenCV_LIBS})
然後:
cmake .
make
『柒』 如何編譯opencv中的install工程
第一步:由於opencv是在cmake工具下建立的工程,所以我們先要下載cmake,下載地址隨便一搜都有,不多說。下載到home的主目錄下,這里我們是/home/lg。看下面的命令:#cd /home/lg#tar xzvf CMake2.4.7.tar.gz .#cd CMake2.4.7#./boostrap#gmake#make install這樣cmake工具安裝好了,並且可以直接使用cmake命令根據cmake的編譯規律,我們選擇外部編譯。
2
下載Opencv2.3.0到/home/lg解壓後進入Opencv2.3.0的目錄下(這里的opencv與以前版本1.0的不一樣,沒有configure文件,所以我們執行不了 ./configure命令) :#mkdir build#cd build#cmake -D CMAKE_BUILD_TYPE=RELEASE -DCMAKE_INSTALL_PREFIX=/usr/local -D BUILD_PYTHON_SUPPORT=ON.. (這條命令解析可以參考cmake教程, 但是記住這里的第二個選項,我們將opencv安裝在/usr/local目錄下的)#make#make install到這opencv編譯完成,接下去看看opencv這個工具能正常使用。
3
記住這里的做法前一種對fedora有用, 也就是說在fedora的環境下只能使用這種做法, 但是ubuntu卻可以使用兩種方法。 順便說一下, 經常遇見apt-get命令,這是在ubuntu下使用獲取軟體包的命令, fedora使用的是yum, 記住了, 否則經常出現使用apt-get卻獲取不了軟體包的情況。方法1:在/etc/ld.so.conf.d下新建一個文件opencv.conf,裡面輸入/usr/local/lib方法2:在/etc/ld.so.conf文件中加入/usr/local/lib這一行然後執行#ldconfig(root許可權下)#cp /usr/local/lib/pkconfig/opencv.pc /usr/lib/pkgconfig(或者是輸入這個命令 exportPKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH)( pkconfig的用法見以前的博文)至此opencv安裝完成我們可以找個例子來做實驗#cd /home/lg/Opencv2.3.0#cd samples/cpp#g++ `pkconfig --cflags --libs opencv` drawing.cpp -odrawing(記住前面的兩個引號是通過ESC下面的那個波浪符鍵獲得的)現在我們編譯那個人臉檢測程序,在Opencv2.3.0/data/目錄下有檢測鼻子、眼睛的XML文件,這可以通過改build目錄下的c目錄下的facedetect文件獲得。#cd ..#cd c#g++ `pkconfig --cflags --libs opencv` facedetect.c -ofacedetect到此結束
『捌』 如何編譯 opencv動態鏈接庫
在一個項目中需要用到OpenCV,剛開始使用了OpenCV的動態鏈接庫,這樣,在移動可執行程序時還必須將OpenCV動態支持庫一起搬移,很是麻煩。所以,最終選擇OpenCV靜態鏈接庫,這樣程序移植運行就方便了很多。
需要編譯成靜態庫以便於應用程序鏈接。
網上有的教程中寫的在VC++2010下安裝OpenCV2.1時用到了TBB庫,而我在編譯鏈接自己的程序後需要用到TBB.dll。本人設計的目的就是要做一個獨立的界面程序,不需要攜帶其他第三方庫。經過一段時間的努力最終找到了編譯OpenCV2.1靜態庫的方法。
需要的工具環境及文件:
-------------------------------------------------------------------------------------------------------------
1、Windows XP
2、VC++2010(VS2010)
3、為編譯OpenCV源碼包(我下載的有:OpenCV2.1.0,OpenCV2.3.0及OpenCV2.4.4)
4、CMake2.8.9
說明:OpenCV各版本官方下載地址:opencv.org/
cmake-2.8.9下載地址:ishare.iask.sina.com.cn/download/explain.php?fileid=35025936
--------------------------------------------------------------------------------------------------------------
以OpenCV2.1.0編譯靜態庫為例
CMake配置
-------------------------------------------------------------------------------------------------------------
打開CMake並設置:
Where is the rource code :OpenCV源代碼所在的文件夾
Where to build the binaries:CMake配置好得到的文件放在位置(我的:E:\OpenCV2.1.0-prj)
然後點擊configure,選擇"Visual Studio 10"。然後確定。
等待configure完成,會出現很多紅色的選項,因為主要是生成OpenCV的庫,所以只需保留某些選項:
去掉BUILD_NEW_PYTHON_SUPPORT,BUILD_SHARED_LIBS, BUILD_TESTS
勾選OPENCV_BUILD_3RDPARTY_LIBS, WITH_TBB,WITH_JASPER, WITH_JPEG,
WITH_PNG, WITH_TIFF選項,
然後再點擊configure,如下圖:
提示TBB_INCLUDE_DIR找不到,因為我們不需要TBB庫,所以忽略,再一次點擊configure。
等待配置完成,最後點擊generate,完成後關閉CMake。
-------------------------------------------------------------------------------------------------------------
VC++2010編譯靜態庫
-------------------------------------------------------------------------------------------------------------
進入E:\OpenCV2.1.0-prj目錄,使用VC++2010打開.sln文件,打開項目管理器
這時候會看到
解決方案中有很多小項目存在。
註:這時我們右鍵任意點擊一個子項目(如cv),選擇屬性,可以在配置屬性下的常規項目中看到,配置類型為
靜態庫(lib)。
按住ctrl鍵,選中除過ALL_BUILD, INSTALL, ZERO_CHECK,
uninstall四個項目的其他所有項目,在菜單中選擇項目->屬性,打開配置屬性->c/c++->代碼生成選項,在右側窗口中的運行時庫中選擇多線程調試(/MTd),然後確認。
說明:這里有四個選項(/MT, /MTd, /MD,
/MDd),前兩個一組,為靜態鏈接運行時庫,運行時不需要運行時庫的支持,代碼直接插入到程序中去;後兩個一組,為動態鏈接運行時庫,運行時需要msvcr90.dll或msvcp90.dll支持。
我們先編譯Debug版的OpenCV靜態庫,在解決方案"opencv"(22個項目)上單擊右鍵,選擇重新生成解決方案,此時便開始編譯OpenCV庫了,等編譯結束會提示完成16個,失敗4個:
這四個項目生成的是exe程序,不需要管他們。到這步我們已經生成了Debug版本的靜態庫!
然後我們用相同的方式生成Release版的庫,在之前的基礎上只需要將選項選擇多線程/MT,再進行編譯。編譯時警告很多,直接忽略!
注意:/MT即是Release版本,/MTD即是Debug版本。
最終我們需要的靜態庫就存在:E:\OpenCV2.1.0-prj/lib 和 E:\OpenCV2.1.0-prj/3rdparty/lib
兩個目錄,我們編譯好的庫就在這兩個文件夾下。分別
將E:\OpenCV2.1.0-prj/3rdparty/lib中Debug
下面的所有文件Copy到E:\OpenCV2.1.0-prj/lib中的Debug 文件中。
將E:\OpenCV2.1.0-prj/3rdparty/lib中Release下面的所有文件Copy到E:\OpenCV2.1.0-prj/lib中的Release文件中。
『玖』 如何編譯opencv calibration
String.prototype.sub = function (n) {
var r = /[^\x00-\xff]/g;
if (this.replace(r, "mm").length <= n) return this;
// n = n - 3;
var m = Math.floor(n / 2);
for (var i = m; i < this.length; i++) {
if (this.substr(0, i).replace(r, "mm").length >= n) {
return this.substr(0, i);
}