C++ 调用opencv方法时发生编译错误
我得到了一个OpenCV Mat对象的长地址。初始化对象后,我想调用以下方法C++ 调用opencv方法时发生编译错误,c++,opencv,java-native-interface,C++,Opencv,Java Native Interface,我得到了一个OpenCV Mat对象的长地址。初始化对象后,我想调用以下方法 Mat::Mat(const Mat& m, const Range* ranges) 但是我有编译错误。我很久没有做C++了。有人能帮忙吗 代码 void HelloWorld::callBack(jlong addrRgba, float dt) { long lrgba = (long) mRgba; Mat bgraMat = *(Mat*) lrgba; Mat rgbMat = new M
Mat::Mat(const Mat& m, const Range* ranges)
但是我有编译错误。我很久没有做C++了。有人能帮忙吗
代码
void HelloWorld::callBack(jlong addrRgba, float dt) {
long lrgba = (long) mRgba;
Mat bgraMat = *(Mat*) lrgba;
Mat rgbMat = new Mat(&bgraMat, Range::all()); //cant get this to work
}
错误消息
error: no matching function for call to 'cv::Mat::Mat(cv::Mat*, cv::Range)'
你能试试这个吗
Range rAll = Range::all() ;
Mat *rgbMat = new Mat(bgraMat, &rAll);
编辑:PK。很好,它解决了问题。只是为了帮助你理解我为什么提出这个:
您要使用构造函数:
Mat::Mat(const Mat& m, const Range* ranges)
它引用一个Mat
变量。您只需传递一个Mat
变量。并将指针指向范围
变量。您可以传递一个范围变量的地址<代码>范围
只需存储两个int
:开始
和结束
。它是可复制的。Range
的一个特殊的“静态”值是all()
返回的内容,以及您可以在rAll
中复制和传递的内容。您需要检查此工作是否正常,而不仅仅是编译
编辑2:为了理解你所做的事情的含义,我将提出简单的建议:
Mat *rgbMat = new Mat(bgraMat);
或
我认为这将是一样的:
Range rAll[2];
rAll[0]= Range::all() ;
rAll[1]= Range::all() ;
Mat *rgbMat = new Mat(bgraMat, rAll);
正如彼得·伍德所言。
此外,我对以下方面很感兴趣:
long lrgba = (long) mRgba;
Mat bgraMat = *(Mat*) lrgba;
如果mRgba是指向要克隆的Mat的指针,为什么不呢
Mat *rgbMat = new Mat(*mRgba);
Range::all
返回什么?看起来它是一个范围
而不是常量范围*
。根据>“静态方法Range::all()返回一些表示“整个序列”或“整个范围”的特殊变量”,就像Matlab中的“:”或Python中的“…”一样。OpenCV中所有接受范围的方法和函数都支持这个特殊的范围::All()值“错误告诉您认为需要什么函数;您正在传递一个指针和一个值。文档中说你实际上需要一个对象和一个指针代码>确定。我已经尝试了几种不同的方法来解决这个错误,但仍然无法正确处理。你能告诉我在上述代码中需要做哪些更改吗?文档中说范围
对Mat m
的每个维度都有一个范围。在您的情况下,如果m
不是一维的,您可能会遇到问题。应该是Mat*rgbMat=new Mat(bgraMat,rAll)代码>,而不是&rAll
。
Mat *rgbMat = new Mat(*mRgba);