Usar OpenCV en Xcode 4 para una aplicación orientada a objetos Mac OS X

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

Dejar un comentario?

1 Comentarios.

  1. 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

Deje un comentario