我正在使用OpenCV 3.0的Arjun Comar版本在这里https://github.com/arjuncomar/opencv ... Arjun Comar更新了此版本的OpenCV,以自动为所有OpenCV函数生成C包装器,因此没有良好c++ FFI的语言仍然可以为OpenCV创建包装器。 C++的C包装器位于文件opencv_genic.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)'的函数。唯一的事情是他没有创建create Scalar函数或创建Scalar *的任何替代方法。我的尝试在下面并且未编译
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);
}
因此,我将有一个标量传递给Arjun Comar创建的c包装器“absdiff”功能
这里:
void cv_absdiff(Mat* src1, Mat* src2, Mat* dst) {
cv::absdiff(*src1, *src2, *dst);
}
任何帮助都感激不尽=)
最佳答案
显然,由于转换,它无法编译,但是您是否不能动态地创建新的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);
}
如果要返回指向该对象的指针,则必须采用这种方式。您不能通过创建副本来返回新对象,而必须更改方法签名。
关于c++ - OpenCV-C++-如何转换cv::Scalar以在C包装程序中为cv::Scalar返回指针?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22275557/