From 879c0196d44dc62ac394f76b13cf64047c40c16d Mon Sep 17 00:00:00 2001 From: Ilya Lavrenov Date: Thu, 13 Feb 2014 00:17:15 +0400 Subject: [PATCH] enabled OpenGL on MacOSX --- CMakeLists.txt | 2 +- modules/core/src/gl_core_3_1.cpp | 31 +++++---- samples/cpp/Qt_sample/CMakeLists.txt | 2 +- .../cpp/Qt_sample/{main.cpp => qt_opengl.cpp} | 65 ++++++++++--------- 4 files changed, 53 insertions(+), 47 deletions(-) rename samples/cpp/Qt_sample/{main.cpp => qt_opengl.cpp} (82%) diff --git a/CMakeLists.txt b/CMakeLists.txt index f515682f4a..ba239a55c9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -142,7 +142,7 @@ OCV_OPTION(WITH_IPP "Include Intel IPP support" OFF OCV_OPTION(WITH_JASPER "Include JPEG2K support" ON IF (NOT IOS) ) OCV_OPTION(WITH_JPEG "Include JPEG support" ON) OCV_OPTION(WITH_OPENEXR "Include ILM support via OpenEXR" ON IF (NOT IOS) ) -OCV_OPTION(WITH_OPENGL "Include OpenGL support" OFF IF (NOT ANDROID AND NOT APPLE) ) +OCV_OPTION(WITH_OPENGL "Include OpenGL support" OFF IF (NOT ANDROID) ) OCV_OPTION(WITH_OPENNI "Include OpenNI support" OFF IF (NOT ANDROID AND NOT IOS) ) OCV_OPTION(WITH_PNG "Include PNG support" ON) OCV_OPTION(WITH_PVAPI "Include Prosilica GigE support" ON IF (NOT ANDROID AND NOT IOS) ) diff --git a/modules/core/src/gl_core_3_1.cpp b/modules/core/src/gl_core_3_1.cpp index bd1eb7ddd3..4a83ba0ca0 100644 --- a/modules/core/src/gl_core_3_1.cpp +++ b/modules/core/src/gl_core_3_1.cpp @@ -47,22 +47,27 @@ #include "gl_core_3_1.hpp" #ifdef HAVE_OPENGL - #if defined(__APPLE__) - #include + + #ifdef __APPLE__ + #include static void* AppleGLGetProcAddress (const char* name) { - static const struct mach_header* image = 0; - if (!image) - image = NSAddImage("/System/Library/Frameworks/OpenGL.framework/Versions/Current/OpenGL", NSADDIMAGE_OPTION_RETURN_ON_ERROR); - - // prepend a '_' for the Unix C symbol mangling convention - std::string symbolName = "_"; - symbolName += std::string(name); - - NSSymbol symbol = image ? NSLookupSymbolInImage(image, &symbolName[0], NSLOOKUPSYMBOLINIMAGE_OPTION_BIND | NSLOOKUPSYMBOLINIMAGE_OPTION_RETURN_ON_ERROR) : 0; - - return symbol ? NSAddressOfSymbol(symbol) : 0; + static bool initialized = false; + static void * handle = NULL; + if (!handle) + { + if (!initialized) + { + initialized = true; + const char * const path = "/System/Library/Frameworks/OpenGL.framework/Versions/Current/OpenGL"; + + handle = dlopen(path, RTLD_LAZY | RTLD_GLOBAL); + } + if (!handle) + return NULL; + } + return dlsym(handle, name); } #endif // __APPLE__ diff --git a/samples/cpp/Qt_sample/CMakeLists.txt b/samples/cpp/Qt_sample/CMakeLists.txt index e831f752f6..f465947dbc 100644 --- a/samples/cpp/Qt_sample/CMakeLists.txt +++ b/samples/cpp/Qt_sample/CMakeLists.txt @@ -7,6 +7,6 @@ FIND_PACKAGE( OpenCV REQUIRED ) find_package (OpenGL REQUIRED) -ADD_EXECUTABLE(OpenGL_Qt_Binding main.cpp) +ADD_EXECUTABLE(OpenGL_Qt_Binding qt_opengl.cpp) TARGET_LINK_LIBRARIES(OpenGL_Qt_Binding ${OpenCV_LIBS} ${OPENGL_LIBRARIES} ) configure_file(${CMAKE_CURRENT_SOURCE_DIR}/cube4.avi ${CMAKE_CURRENT_BINARY_DIR}/cube4.avi COPYONLY) diff --git a/samples/cpp/Qt_sample/main.cpp b/samples/cpp/Qt_sample/qt_opengl.cpp similarity index 82% rename from samples/cpp/Qt_sample/main.cpp rename to samples/cpp/Qt_sample/qt_opengl.cpp index 6969544a0c..91f8a76f88 100644 --- a/samples/cpp/Qt_sample/main.cpp +++ b/samples/cpp/Qt_sample/qt_opengl.cpp @@ -33,14 +33,14 @@ static void help() cout << "\nThis demo demonstrates the use of the Qt enhanced version of the highgui GUI interface\n" " and dang if it doesn't throw in the use of of the POSIT 3D tracking algorithm too\n" "It works off of the video: cube4.avi\n" - "Using OpenCV version %s\n" << CV_VERSION << "\n\n" -" 1). This demo is mainly based on work from Javier Barandiaran Martirena\n" -" See this page http://code.opencv.org/projects/opencv/wiki/Posit.\n" -" 2). This is a demo to illustrate how to use **OpenGL Callback**.\n" -" 3). You need Qt binding to compile this sample with OpenGL support enabled.\n" -" 4). The features' detection is very basic and could highly be improved \n" -" (basic thresholding tuned for the specific video) but 2).\n" -" 5) THANKS TO Google Summer of Code 2010 for supporting this work!\n" << endl; + "Using OpenCV version " << CV_VERSION << "\n\n" + " 1). This demo is mainly based on work from Javier Barandiaran Martirena\n" + " See this page http://code.opencv.org/projects/opencv/wiki/Posit.\n" + " 2). This is a demo to illustrate how to use **OpenGL Callback**.\n" + " 3). You need Qt binding to compile this sample with OpenGL support enabled.\n" + " 4). The features' detection is very basic and could highly be improved \n" + " (basic thresholding tuned for the specific video) but 2).\n" + " 5) THANKS TO Google Summer of Code 2010 for supporting this work!\n" << endl; } #define FOCAL_LENGTH 600 @@ -88,7 +88,6 @@ static void renderCube(float size) glEnd(); } - static void on_opengl(void* param) { //Draw the object with the estimated pose @@ -121,8 +120,6 @@ static void foundCorners(vector *srcImagePoints, const Mat& source threshold(grayImage, grayImage, 26, 255, THRESH_BINARY_INV); //25 Mat MgrayImage = grayImage; - //For debug - //MgrayImage = MgrayImage.clone();//deep copy vector > contours; vector hierarchy; findContours(MgrayImage, contours, hierarchy, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE); @@ -199,21 +196,15 @@ static void foundCorners(vector *srcImagePoints, const Mat& source srcImagePoints->at(i) = cvPoint2D32f(srcImagePoints_temp.at(i).x-source.cols/2,source.rows/2-srcImagePoints_temp.at(i).y); } } - } static void createOpenGLMatrixFrom(float *posePOSIT,const CvMatr32f &rotationMatrix, const CvVect32f &translationVector) { - - //coordinate system returned is relative to the first 3D input point for (int f=0; f<3; f++) - { for (int c=0; c<3; c++) - { posePOSIT[c*4+f] = rotationMatrix[f*3+c]; //transposed - } - } + posePOSIT[3] = 0.0; posePOSIT[7] = 0.0; posePOSIT[11] = 0.0; @@ -226,19 +217,27 @@ static void createOpenGLMatrixFrom(float *posePOSIT,const CvMatr32f &rotationMat int main(void) { help(); - VideoCapture video("cube4.avi"); - CV_Assert(video.isOpened()); - Mat source, grayImage; + string fileName = "cube4.avi"; + VideoCapture video(fileName); + if (!video.isOpened()) + { + cerr << "Video file " << fileName << " could not be opened" << endl; + return EXIT_FAILURE; + } + Mat source, grayImage; video >> source; namedWindow("original", WINDOW_AUTOSIZE | CV_WINDOW_FREERATIO); - namedWindow("POSIT", WINDOW_AUTOSIZE | CV_WINDOW_FREERATIO); - displayOverlay("POSIT", "We lost the 4 corners' detection quite often (the red circles disappear). This demo is only to illustrate how to use OpenGL callback.\n -- Press ESC to exit.", 10000); + namedWindow("POSIT", WINDOW_OPENGL | CV_WINDOW_FREERATIO); + resizeWindow("POSIT", source.cols, source.rows); - float OpenGLMatrix[]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; - setOpenGlDrawCallback("POSIT",on_opengl,OpenGLMatrix); + displayOverlay("POSIT", "We lost the 4 corners' detection quite often (the red circles disappear)." + "This demo is only to illustrate how to use OpenGL callback.\n -- Press ESC to exit.", 10000); + + float OpenGLMatrix[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; + setOpenGlDrawCallback("POSIT", on_opengl, OpenGLMatrix); vector modelPoints; initPOSIT(&modelPoints); @@ -248,19 +247,20 @@ int main(void) CvMatr32f rotation_matrix = new float[9]; CvVect32f translation_vector = new float[3]; - CvTermCriteria criteria = cvTermCriteria(CV_TERMCRIT_EPS | CV_TERMCRIT_ITER, 100, 1.0e-4f); - - vector srcImagePoints(4,cvPoint2D32f(0,0)); + CvTermCriteria criteria = cvTermCriteria(CV_TERMCRIT_EPS | CV_TERMCRIT_ITER, 100, 1e-4f); + vector srcImagePoints(4, cvPoint2D32f(0, 0)); - - while(waitKey(33) != 27) + while (waitKey(33) != 27) { video >> source; - imshow("original",source); + if (source.empty()) + break; + + imshow("original", source); foundCorners(&srcImagePoints,source,grayImage); cvPOSIT( positObject, &srcImagePoints[0], FOCAL_LENGTH, criteria, rotation_matrix, translation_vector ); - createOpenGLMatrixFrom(OpenGLMatrix,rotation_matrix,translation_vector); + createOpenGLMatrixFrom(OpenGLMatrix, rotation_matrix, translation_vector); imshow("POSIT",source); @@ -268,6 +268,7 @@ int main(void) video.set(CV_CAP_PROP_POS_AVI_RATIO, 0); } + setOpenGlDrawCallback("POSIT", 0, 0); destroyAllWindows(); cvReleasePOSITObject(&positObject);