enabled OpenGL on MacOSX

This commit is contained in:
Ilya Lavrenov 2014-02-13 00:17:15 +04:00
parent e55679079f
commit 879c0196d4
4 changed files with 52 additions and 46 deletions

View File

@ -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_JASPER "Include JPEG2K support" ON IF (NOT IOS) )
OCV_OPTION(WITH_JPEG "Include JPEG support" ON) OCV_OPTION(WITH_JPEG "Include JPEG support" ON)
OCV_OPTION(WITH_OPENEXR "Include ILM support via OpenEXR" ON IF (NOT IOS) ) 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_OPENNI "Include OpenNI support" OFF IF (NOT ANDROID AND NOT IOS) )
OCV_OPTION(WITH_PNG "Include PNG support" ON) OCV_OPTION(WITH_PNG "Include PNG support" ON)
OCV_OPTION(WITH_PVAPI "Include Prosilica GigE support" ON IF (NOT ANDROID AND NOT IOS) ) OCV_OPTION(WITH_PVAPI "Include Prosilica GigE support" ON IF (NOT ANDROID AND NOT IOS) )

View File

@ -47,22 +47,27 @@
#include "gl_core_3_1.hpp" #include "gl_core_3_1.hpp"
#ifdef HAVE_OPENGL #ifdef HAVE_OPENGL
#if defined(__APPLE__)
#include <mach-o/dyld.h> #ifdef __APPLE__
#include <dlfcn.h>
static void* AppleGLGetProcAddress (const char* name) static void* AppleGLGetProcAddress (const char* name)
{ {
static const struct mach_header* image = 0; static bool initialized = false;
if (!image) static void * handle = NULL;
image = NSAddImage("/System/Library/Frameworks/OpenGL.framework/Versions/Current/OpenGL", NSADDIMAGE_OPTION_RETURN_ON_ERROR); if (!handle)
{
if (!initialized)
{
initialized = true;
const char * const path = "/System/Library/Frameworks/OpenGL.framework/Versions/Current/OpenGL";
// prepend a '_' for the Unix C symbol mangling convention handle = dlopen(path, RTLD_LAZY | RTLD_GLOBAL);
std::string symbolName = "_"; }
symbolName += std::string(name); if (!handle)
return NULL;
NSSymbol symbol = image ? NSLookupSymbolInImage(image, &symbolName[0], NSLOOKUPSYMBOLINIMAGE_OPTION_BIND | NSLOOKUPSYMBOLINIMAGE_OPTION_RETURN_ON_ERROR) : 0; }
return dlsym(handle, name);
return symbol ? NSAddressOfSymbol(symbol) : 0;
} }
#endif // __APPLE__ #endif // __APPLE__

View File

@ -7,6 +7,6 @@ FIND_PACKAGE( OpenCV REQUIRED )
find_package (OpenGL 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} ) 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) configure_file(${CMAKE_CURRENT_SOURCE_DIR}/cube4.avi ${CMAKE_CURRENT_BINARY_DIR}/cube4.avi COPYONLY)

View File

@ -33,14 +33,14 @@ static void help()
cout << "\nThis demo demonstrates the use of the Qt enhanced version of the highgui GUI interface\n" 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" " 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" "It works off of the video: cube4.avi\n"
"Using OpenCV version %s\n" << CV_VERSION << "\n\n" "Using OpenCV version " << CV_VERSION << "\n\n"
" 1). This demo is mainly based on work from Javier Barandiaran Martirena\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" " 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" " 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" " 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" " 4). The features' detection is very basic and could highly be improved \n"
" (basic thresholding tuned for the specific video) but 2).\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; " 5) THANKS TO Google Summer of Code 2010 for supporting this work!\n" << endl;
} }
#define FOCAL_LENGTH 600 #define FOCAL_LENGTH 600
@ -88,7 +88,6 @@ static void renderCube(float size)
glEnd(); glEnd();
} }
static void on_opengl(void* param) static void on_opengl(void* param)
{ {
//Draw the object with the estimated pose //Draw the object with the estimated pose
@ -121,8 +120,6 @@ static void foundCorners(vector<CvPoint2D32f> *srcImagePoints, const Mat& source
threshold(grayImage, grayImage, 26, 255, THRESH_BINARY_INV); //25 threshold(grayImage, grayImage, 26, 255, THRESH_BINARY_INV); //25
Mat MgrayImage = grayImage; Mat MgrayImage = grayImage;
//For debug
//MgrayImage = MgrayImage.clone();//deep copy
vector<vector<Point> > contours; vector<vector<Point> > contours;
vector<Vec4i> hierarchy; vector<Vec4i> hierarchy;
findContours(MgrayImage, contours, hierarchy, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE); findContours(MgrayImage, contours, hierarchy, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE);
@ -199,21 +196,15 @@ static void foundCorners(vector<CvPoint2D32f> *srcImagePoints, const Mat& source
srcImagePoints->at(i) = cvPoint2D32f(srcImagePoints_temp.at(i).x-source.cols/2,source.rows/2-srcImagePoints_temp.at(i).y); 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) static void createOpenGLMatrixFrom(float *posePOSIT,const CvMatr32f &rotationMatrix, const CvVect32f &translationVector)
{ {
//coordinate system returned is relative to the first 3D input point //coordinate system returned is relative to the first 3D input point
for (int f=0; f<3; f++) for (int f=0; f<3; f++)
{
for (int c=0; c<3; c++) for (int c=0; c<3; c++)
{
posePOSIT[c*4+f] = rotationMatrix[f*3+c]; //transposed posePOSIT[c*4+f] = rotationMatrix[f*3+c]; //transposed
}
}
posePOSIT[3] = 0.0; posePOSIT[3] = 0.0;
posePOSIT[7] = 0.0; posePOSIT[7] = 0.0;
posePOSIT[11] = 0.0; posePOSIT[11] = 0.0;
@ -226,19 +217,27 @@ static void createOpenGLMatrixFrom(float *posePOSIT,const CvMatr32f &rotationMat
int main(void) int main(void)
{ {
help(); help();
VideoCapture video("cube4.avi");
CV_Assert(video.isOpened()); 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; Mat source, grayImage;
video >> source; video >> source;
namedWindow("original", WINDOW_AUTOSIZE | CV_WINDOW_FREERATIO); namedWindow("original", WINDOW_AUTOSIZE | CV_WINDOW_FREERATIO);
namedWindow("POSIT", WINDOW_AUTOSIZE | CV_WINDOW_FREERATIO); namedWindow("POSIT", WINDOW_OPENGL | 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); resizeWindow("POSIT", source.cols, source.rows);
float OpenGLMatrix[]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; displayOverlay("POSIT", "We lost the 4 corners' detection quite often (the red circles disappear)."
setOpenGlDrawCallback("POSIT",on_opengl,OpenGLMatrix); "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<CvPoint3D32f> modelPoints; vector<CvPoint3D32f> modelPoints;
initPOSIT(&modelPoints); initPOSIT(&modelPoints);
@ -248,19 +247,20 @@ int main(void)
CvMatr32f rotation_matrix = new float[9]; CvMatr32f rotation_matrix = new float[9];
CvVect32f translation_vector = new float[3]; CvVect32f translation_vector = new float[3];
CvTermCriteria criteria = cvTermCriteria(CV_TERMCRIT_EPS | CV_TERMCRIT_ITER, 100, 1.0e-4f); CvTermCriteria criteria = cvTermCriteria(CV_TERMCRIT_EPS | CV_TERMCRIT_ITER, 100, 1e-4f);
vector<CvPoint2D32f> srcImagePoints(4, cvPoint2D32f(0, 0));
vector<CvPoint2D32f> srcImagePoints(4,cvPoint2D32f(0,0)); while (waitKey(33) != 27)
while(waitKey(33) != 27)
{ {
video >> source; video >> source;
imshow("original",source); if (source.empty())
break;
imshow("original", source);
foundCorners(&srcImagePoints,source,grayImage); foundCorners(&srcImagePoints,source,grayImage);
cvPOSIT( positObject, &srcImagePoints[0], FOCAL_LENGTH, criteria, rotation_matrix, translation_vector ); 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); imshow("POSIT",source);
@ -268,6 +268,7 @@ int main(void)
video.set(CV_CAP_PROP_POS_AVI_RATIO, 0); video.set(CV_CAP_PROP_POS_AVI_RATIO, 0);
} }
setOpenGlDrawCallback("POSIT", 0, 0);
destroyAllWindows(); destroyAllWindows();
cvReleasePOSITObject(&positObject); cvReleasePOSITObject(&positObject);