2013-09-27 2 views
0

Я также задавался вопросом о возможности обертывания интерфейса C++ OpenCV в C, а затем обертывания этого в Lisp, чтобы я мог добавить все функциональные возможности C++ в свою оболочку cl-opencv, потому что я хотел бы сделать это полностью .... Также задавался вопросом, могу ли я это сделать, могу ли я использовать оболочку C++ с оболочкой C в lisp .... если это возможно, если вы можете показать мне быструю примерную программу, например, открытое окно и показать функцию изображения, только в c и C++ вместе .... нравится использовать cv :: namedWindow вместо cvNamedWindow, а все остальные части являются c ..... вот моя попытка программа ниже работает, когда я использую cv :: namedWindow, но с ошибкойМогу ли я перенести интерфейс C++ OpenCV на C и затем обернуть его с помощью CFFI Lisp?

shape.cpp:37:32: error: invalid initialization of 
reference of type ‘cv::InputArray {aka const cv::_InputArray&}’ 
    from expression of type ‘IplImage* {aka _IplImage*}’In file included from 
/usr/local/include/opencv/highgui.h:48:0, 

        from shape.cpp:4: 
/usr/local/include/opencv2/highgui/highgui.hpp:78:19: error: 
in passing argument 2 of ‘void cv::imshow(const string&, cv::InputArray)’ 
Compilation exited abnormally with code 1 at Thu Sep 26 21:18:00 

, когда я добавляю cv :: imshow

#include <cv.h> 
    #include <highgui.h> 
    using namespace std; 


    int main(){ 
     CvCapture* capture =0;  

     capture = cvCaptureFromCAM(0); 
     if(!capture){ 
    printf("Capture failure\n"); 
    return -1; 
     } 

     IplImage* frame=0; 


     cv::namedWindow("Video"); 



    // cout << "colorModel = " << endl << " " << size << endl << endl; 


    while(true){ 

       frame = cvQueryFrame(capture);   
       if(!frame) break; 

       frame=cvCloneImage(frame); 




      cv::imshow("Video", frame); 


       cvReleaseImage(&frame); 

       //Wait 50mS 
       int c = cvWaitKey(10); 
       //If 'ESC' is pressed, break the loop 
       if((char)c==27) break;  
     } 

     cvDestroyAllWindows() ; 
     cvReleaseCapture(&capture);  

     return 0; 
    } 

Я хотел бы знать, будет ли это выполнимо ... как быть на 100% уверен, прежде чем я начну, что я мог бы, по крайней мере, обернуть каждую функцию C++ в c и обернуть ее с помощью lisp..или если и подумать id запускается в коряги в некоторых местах или даже невозможности ..... а также будет его обертывание в два раза сделать его медленным? и id c-интерфейс лучше/хуже, чем C++ .. или я могу выполнить все в c-интерфейсе, который я могу в C++

Я спрашиваю об этом, потому что в документации swig и cffi говорится, что поддержка C++ не завершена.

Ах да, и я также попытался запустить приведенный выше код со всеми этими заголовками

#include <cv.h> 
#include <highgui.h> 
#include "opencv2/highgui/highgui.hpp" 
#include <iostream> 

using namespace cv; 
using namespace std; 

и до сих пор получаю выше ошибки

+0

Это просто догадка, я никогда этого не делал. Я слышал, что оба варианта можно связать с C++ кодом с Lisp и что это очень сложная задача, конечно, не прямолинейная. Мое другое предположение, как в том, что попробовать, я бы посмотрел на «extern» C «...» декларации и, возможно, работал оттуда, хотя это действительно просто ощущение кишки. –

ответ

1

От the OpenCV documentation, InputArray является

класс, который может быть построенный из Mat, Mat_, Matx, std :: vector, std :: vector> или std :: vector. Он также может быть построен из матричного выражения.

Вы пытаетесь передать IplImage где InputArray требуется, и это не допускается. Вы можете использовать

cvShowImage("Video", frame); 

или конвертировать ваши IplImage к Mat и передать в imshow():

IplImage* frame; 
// write to frame 
... 
// convert to cv::Mat and show the converted image 
cv::Mat mat_frame(frame); 
cv::imshow("Video", mat_frame) 

Еще лучше было бы не использовать IplImage вообще, она является частью унаследованной API. Мат предпочтительнее.

cv::VideoCapture capture; 
capture.open(0); 
cv::Mat frame; 
cv::namedWindow("Video"); 

if (capture.isOpened()) { 
    while (true) { 
     capture >> frame; 
     if (!frame.empty()) { 
      cv::imshow("Video", frame); 

      int c = cv::waitKey(10); 
      if ((char) c == 27) { 
       break; 
      } 
     } 
    } 
} 

В теории можно написать обертки для все, чтобы звонок из Лиспа CFFI, но это, вероятно, не стоит времени и боли. Я бы закодировал часть OpenCV вашего приложения на C++, а затем использовал C/CFFI для вызова этого из Lisp.

+0

эй, это тоже мое прозвище ... я люблю кодировать все в lisp, поэтому мне нужно преобразовать все opencv, cuz его лучшее, в lisp, но если бы я решил «написать обертку для всего, чтобы разрешить звонить из Lisp CFFI», быть уменьшением скорости вдвое ...и с такой же хорошей, как C++ для opencv, или я бы выиграл от попыток обернуть C++ –

+1

Снижение скорости, вероятно, не имеет большого значения. Многие из функций в C api уже являются обертками вокруг C++ API. OK, вы любите Lisp, но вы, вероятно, потратите больше времени на написание оберток в C/C++, чтобы вы могли использовать Lisp, чем если бы вы просто написали приложение на C++. – Bull

+0

спасибо за информацию о скорости ... да, я тоже люблю обертывание ... Любите хакерство этого –