Могу ли я обернуть интерфейс OpenCV C ++ с C, а затем обернуть это с CFFI Lisp?

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

 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 сталкивается с препятствиями в некоторые места или даже невозможность ….. и также, обернул бы это дважды, замедлило бы? и идентифицируем интерфейс 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

Решение

От документация OpenCV, 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;
}
}
}
}

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

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector