Мне также было интересно узнать, можно ли обернуть интерфейс 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;
и все равно получаю ошибку выше
От документация 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.
Других решений пока нет …