Lo primero de todo es instalar OpenCV en Mac OS X. Luego en Xcode 4 crear un nuevo proyecto de aplicación para Mac OS X de tipo “Command Line Tool”.
Poner un nombre de proyecto en “Product Name” y en “Type” elegir “Foundation”.
En la pestaña “Build Settings” (haciendo click en el icono azul del proyecto a la izquierda) añadir a las siguientes opciones estos valores:
Dentro de “Search Paths”:
Header Search Paths: /usr/local/include
Library Search Paths: /usr/local/lib
Dentro de “Linking”:
Other Linker Flags: -lopencv_core -lopencv_highgui -lopencv_imgproc
NOTA: Se pueden añadir más librerías en “Other Linker Flags” para incluir más funciones de OpenCV como por ejemplo:
-lopencv_core -lopencv_highgui -lopencv_imgproc -lopencv_legacy -lopencv_contrib -lopencv_calib3d -lopencv_features2d -lopencv_flann -lopencv_ml -lopencv_objdetect -lopencv_video
Si quieres usar también las funciones en C de OpenCV tienes que cambiar dentro de “Build Options” el siguiente parámetro:
Compiler for C/C++/Objetive-C: LLVM GCC 4.2
Cambiar el nombre del fichero “main.m
” a “main.mm
“. Esto hace que el código se intérprete como Objetive-C++ en vez de solo como Objetive-C.
Ahora (MUY IMPORTANTE) dentro del fichero .pch
de la carpeta de proyecto “Supporting Files” añadir ANTES de cualquier otro import el siguiente import:
#ifdef __cplusplus #import "opencv2/opencv.hpp" #endif
Esto se debe a que OpenCV tiene definida una macro MIN que también existe en el framework de Apple y si no se pone la de OpenCV antes aparecen errores del tipo “LLVM GCC 4.2 Error: Statement-expressions are allowed only inside functions
” o “opencv2/core/core.hpp:433: error: statement-expressions are allowed only inside functions
“. El import está rodeado de ese “ifdef
” para que los ficheros que no usan código Objetive-C++ puedan mantener la extensión “.m
” y no haga falta modificar todos a “.mm
“.
Rellenar el fichero “main.mm
” con el siguiente código de ejemplo, que es de hecho la versión Orientada a Objetos del ejemplo que usé en Usar OpenCV en Xcode 4 para una aplicación Mac OS X:
// // main.mm // OpenCVOOTest // // Created by __MyName__ on 16/09/11. // Copyright 2011 __MyCompanyName__. All rights reserved. // #import#import "opencv2/opencv.hpp" using namespace cv; int main (int argc, const char * argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; Mat img(cv::Size(640, 480), CV_8UC3); circle(img, cv::Point(320, 240), 100, Scalar(255, 0, 0, 255), 5, 8, 0); namedWindow("OpenCV Window", CV_WINDOW_NORMAL); imshow("OpenCV Window", img); waitKey(0); [pool drain]; return 0; }
Si al hacer el linkado de la aplicación da el siguiente error:
"Undefined symbols for architecture x86_64:"
Seguido de un montón de nombres de funciones, hay que cambiar la arquitectura del programa a i386. Para ello dentro del “Build Settings” del proyecto cambiar la opción “Arquitectures” a “32-bit Intel”. Esto por sí solo tal vez no resuelva el problema, ya que OpenCV tiene que estar también compilado para i386 32 bits.
Fuentes: http://stackoverflow.com/questions/3810800/how-to-include-opencv-in-cocoa-application
http://computer-vision-talks.com/2011/03/opencv-build-script-with-xcode-4-support-is-here
Thanks a lot, you saved my day. There seeems to be a lot of ‘How To’s around, but none of them worked for my system (opencv 2.4.2 with macports, XCode 4.5 on 10.7.4) I did not need to edit the .pch file (didnt’ find it anyway).
Cheers