0

我还想知道是否有可能将 OpenCV 的 C++ 接口包装在 C 中,然后将其包装在 Lisp 中,这样我就可以将所有 C++ 功能也添加到我的 cl-opencv 包装器中,因为我想让它完整....也想知道如果我这样做,我可以在 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 遇到障碍有些地方甚至是不可能的......而且还会将它包裹两次使其变慢吗?并且 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;

仍然得到上述错误

4

1 回答 1

1

OpenCV 文档中,InputArray

可以从 Mat、Mat_、Matx、std::vector、std::vector > 或 std::vector 构造的类。它也可以从矩阵表达式构造。

您正在尝试传递一个需要的IplImage地方InputArray,这是不允许的。你可以使用

cvShowImage("Video", frame);

或将您的转换IplImage为 aMat并将其传递给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 调用,但这可能不值得花时间和痛苦。我会用 C++ 编写应用程序的 OpenCV 部分,然后使用 C/CFFI 从 Lisp 调用它。

于 2013-09-27T06:47:38.207 回答