本文原創,未經同意,謝絕轉載!(轉載請告知本人並且經過本人同意--By Pacific-hong)
本人小碩一枚,因為專業方向圖像相關,所以用到opencv,然后網上MAC下Xcode配置opencv的教程比較少,要不然就是過時了。所以在一番倒騰之后,成功配置了OpenCV。寫下本文供他人參考,少走彎路。
一.版本介紹
首先介紹macOS,Xcode,OpenCV版本:
macOS: macOS Sierra 10.12.4
Xcode: Xcode 8.3(8E162)
OpenCV:opencv 2.4.13.2
二.安裝OpenCV
不要從官網下載opencv,因為官網沒有macos版本(ios版本不能用在macbook下),本文中使用HomeBrew安裝,方便快捷。
1) 打開終端:復制粘貼下面腳本:
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
如果已經安裝過會有提示,就不會再安裝了,關於HomeBrew的安裝,可以參考 http://www.cnblogs.com/lzrabbit/p/4032515.html
出現Installation successful 就說明已經安裝成功了,輸入執行brew help能查看brew的具體用法.
2) 為了保證套件的完整,接着執行官網的建議腳本,安裝wget.
brew install wget
3) 接着裝cmake,這個是必須要裝的.
brew install cmake
4) 重點:這里就是不同於網上大部分mac配置opencv方法之處,讓brew幫我們下載OpenCV,而不是自己上OpenCV官網下載,切記,我從頭到尾都不會讓讀者上官網去下載,因為我沒有成功,這里感謝提出這種方法的大大mac下配置openCV(看看就行,畢竟文章很早了).
brew install opencv
這里直接執行這個命令可能會報一個小小的錯,不過無關緊要,大概意思就是不能直接找到這個命令,終端會自己接着找,然后會告訴你正確的命令應該怎么寫,由於當時沒有截圖,所以具體命令我不記得了,實在抱歉,大家只要稍微有點英語基礎,大概看下終端彈出來的描述,就能夠知道具體應該執行的命令行了,這里應該是會提示出兩個命令,選擇關鍵字是opencv的執行即可,執行后brew會自動下載opencv,上圖(因為本人機器上已經安裝,所以沒有顯示安裝的過程,不過這個不重要了):
這就是我最后裝的OpenCV的版本,這就是為什么我不用最新的版本(因為根本沒得選??????),不過大家放心,brew既然選擇了這個版本自然有他的理由,讀者也不用糾結這個問題,舊一點的版本不一定就不好.
下面是本地的安裝目錄:
/usr/local/Cellar目錄下的文件都是brew幫我們下載好的,里面的cmake,wget,opencv是我們自己下載的,其他的都是brew幫我們下的(應該都是有用的東西,什么都不要我們管,很方便有沒有).
三.在Xcode上配置OpenCV
創建一個空的command line 工程:選擇OS X -> Application -> Command Line Tool->Next;填寫自己的product名,選擇語言為C++,選擇自己存放的目錄。
然后就是opencv的配置了:
點擊工程,選擇TARGETS->右側選擇All->Build Settings -> 搜索框輸入search paths ->選擇search paths下面的Header Search Parhs ->雙擊后面的詳細信息添加指定路徑:/usr/local/include (大家可以點擊空白桌面按shift+command+g前往該目錄下查看,這里目錄里有剛才下好的OpenCV庫的頭文件)
選擇search paths下面的Library Search Parhs ->雙擊添加指定路徑:/usr/local/lib (這里包含了所需要的庫文件).
右擊工程new一個group,然后打開/usr/local/Cellar/opencv/2.4.13.2/lib目錄(同樣點擊下空白桌面,然后shift+command+g)這個目錄之前帶大家看過一次就是brew幫我們下載的opencv目錄下的lib目錄,然后大家按照文件種類排序可以看到一些.dylib文件,將這些.dylib文件拖入剛才新建的文件夾下.我這里是18個文件,網上有說要加所有后綴是dylib文件,其實左下角帶箭頭的那些不用管.
關於如何進入/usr目錄,還有一種方法:雙指點擊(相當於windows下的右擊)finder,然后點擊“Go to Folder”,在彈出的搜索框輸入/usr,就能進入/usr目錄啦。
至此,OpenCV配置大功告成。
這里獻上一段zhoufan大大的測試代碼,測試用代碼如下所示,從Mac自帶的攝像頭讀入圖像,然后canny提取了邊緣然后顯示。
1 #include <iostream> 2 #include <opencv2/core/core.hpp> 3 #include <opencv2/highgui/highgui.hpp> 4 #include <opencv2/opencv.hpp> 5 6 7 using namespace std; 8 using namespace cv; 9 10 IplImage* doCanny(IplImage* image_input, 11 double lowThresh, 12 double highThresh, 13 double aperture) 14 { 15 if(image_input->nChannels != 1) 16 return (0); 17 18 IplImage* image_output = cvCreateImage(cvGetSize(image_input), 19 image_input->depth, 20 image_input->nChannels); 21 22 cvCanny(image_input,image_output,lowThresh,highThresh,aperture); 23 24 return(image_output); 25 } 26 27 28 int main(int argc, char* argv[]) 29 { 30 cvNamedWindow("Camera" , CV_WINDOW_AUTOSIZE ); 31 32 CvCapture* capture = cvCreateCameraCapture(CV_CAP_ANY); 33 34 assert(capture != NULL); 35 36 IplImage *frame = 0; 37 frame = cvQueryFrame(capture); 38 39 IplImage *frame_edge = cvCreateImage(cvGetSize(frame), 40 IPL_DEPTH_8U, 41 1); 42 while(1) 43 { 44 frame = cvQueryFrame(capture); 45 if(!frame) break; 46 47 cvConvertImage(frame,frame_edge,0); 48 frame = cvCloneImage(frame_edge); 49 50 frame_edge = doCanny(frame_edge,70,90,3); 51 52 cvShowImage("Camera",frame_edge); 53 char c = cvWaitKey(15); 54 if(c == 27) break; 55 } 56 57 cvReleaseCapture(&capture); 58 cvReleaseImage( &frame_edge ); 59 cvReleaseImage( &frame); 60 61 62 return (int)0; 63 }
貼幾張自己跑出來的測試圖:
程序運行各項設備利用率: