【问题标题】:OpenCV - C++ - How do Convert a cv::Scalar to return a pointer in a C wrapper for cv::Scalar?OpenCV - C++ - 如何转换 cv::Scalar 以在 cv::Scalar 的 C 包装器中返回指针?
【发布时间】:2014-03-08 21:56:09
【问题描述】:

我正在使用 OpenCV 3.0 的 Arjun Comar 版本 https://github.com/arjuncomar/opencv ...Arjun Comar 更新了此版本的 OpenCV 以自动为所有 OpenCV 函数生成 C 包装器,因此没有良好 c++ FFI 的语言仍然可以为开放式简历。 C++ 的 C 包装器位于文件 opencv_generated.cpp 中(必须从上面链接的 Arjun Comar OpenCV 版本构建,但我在此处粘贴了我的当前版本http://www.heypasteit.com/clip/17SI 和 mat.cpp rect.cpp point.cpp 和 size.cpp 位于这里https://github.com/arjuncomar/opencv/tree/master/modules/c/src

在那个版本中,他使用标量指针 ('Scalar*') 来代表所有需要 'cv::Scalar(val1 val2 val3 val4)' 的函数。唯一的问题是他没有创建创建标量函数或任何替代创建标量*。我的尝试在下面,它没有编译

cpp

 Scalar* cv_create_Scalar(double val0, double val1, double val2, double val3)
 {
      //also tried cv:;Scalar - same error
     return Scalar(val0, val1, val2, val3);

 }

hpp

'Scalar* cv_create_Scalar(double val0, double val1, double val2, double val3);'

在 Ubuntu Trusty 上的 cpp 目录中编译

'g++ -Wall -shared -fPIC -o opencv-glue.so opencv-glue.cpp'

但是我收到了这个错误

 opencv-glue.cpp: In function ‘cv::Scalar* cv_create_Scalar
 (double, double, double, double)’:
 opencv-glue.cpp:28:41: error: cannot convert 
 ‘cv::Scalar’ to ‘cv::Scalar* {aka cv::Scalar_<double>*}’ in return
      return Scalar(val0, val1, val2, val3);
                                     ^
 opencv-glue.cpp:30:1: warning: control reaches end of 
 non-void function [-Wreturn-type]
  }

我知道它不是编译函数……它经过了很好的测试,但我需要一个 Scalar* 来传递给我创建的这样一个函数(编译正确)

 Mat* cv_create_Mat_S(Size* size, int type, Scalar* s) {
      return new Mat(*size, type, *s);
  }

所以我将有一个标量传递给“absdiff”函数 c 包装器 Arjun Comar 创建 这里:

  void cv_absdiff(Mat* src1, Mat* src2, Mat* dst) {
        cv::absdiff(*src1, *src2, *dst);
  }

非常感谢任何帮助=)

【问题讨论】:

    标签: c++ function opencv wrapper


    【解决方案1】:

    显然,由于转换,它无法编译,但你不能动态创建新的Scalar吗?你只需要记住这个内存必须通过删除来释放。

     Scalar* cv_create_Scalar(double val0, double val1, double val2, double val3)
     {
          //also tried cv:;Scalar - same error
         return new Scalar(val0, val1, val2, val3);
     }
    

    如果你想返回一个指向这个对象的指针,必须这样做。您不能通过创建副本来返回新对象,您必须更改方法签名。

    【讨论】:

    • 非常感谢我错过了,它编译...祝你有美好的一天=)
    猜你喜欢
    • 2019-05-18
    • 1970-01-01
    • 2015-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-01
    • 2021-11-24
    相关资源
    最近更新 更多