2013-03-11 89 views
0

我得到一个OpenCV Mat对象的地址。初始化对象后,我想打电话给下面的方法调用opencv方法时编译错误

Mat::Mat(const Mat& m, const Range* ranges) 

OpenCV method link

但我得到的编译错误。我很久没有完成C++了。谁能帮忙?

CODE

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)' 
+1

什么'范围:: all'回报?看起来像是'Range'而不是'const Range *'。 – 2013-03-11 09:42:46

+0

根据 http://opencv.willowgarage.com/documentation/cpp/basic_structures.html#range“静态方法Range :: all()返回一些特殊变量,意思是”整个序列“或”整个范围“,就像Matlab中的”:“或Python中的”...“OpenCV中的所有方法和函数都支持这个特殊的Range :: all()值” – asloob 2013-03-11 09:48:02

+0

“错误告诉你你认为你需要什么函数;你正在传递一个指针和一个值。文档说你*实际上*需要一个对象和一个指针。 – 2013-03-11 09:53:40

回答

0

你可以试试这个?

Range rAll = Range::all() ; 
Mat *rgbMat = new Mat(bgraMat, &rAll); 

编辑:PK。很好,它解决了这个问题。只是为了帮助你undertand为什么我提出这样的:

您要使用的构造函数:

Mat::Mat(const Mat& m, const Range* ranges) 

把它带到一个Mat变量的引用。你简单传一个Mat变量。并指向一个Range变量。您可以传递一个Range变量的地址。 Range只是存储两个intstartend。它是可复制的。 Range的一个特殊的“静态”值是all()返回的值以及您可以在rAll中复制和传递的值。你需要检查这个工作是否可行,而不仅仅是编译。

编辑2:尝试了解你在做什么的意思,我会建议很简单:

Mat *rgbMat = new Mat(bgraMat); 

Mat rgbMat = Mat(bgraMat); 

我认为这将是一样的:

Range rAll[2]; 
rAll[0]= Range::all() ; 
rAll[1]= Range::all() ; 
Mat *rgbMat = new Mat(bgraMat, rAll); 

as @Peter Wood pinted。 还有我对古玩:

long lrgba = (long) mRgba; 
Mat bgraMat = *(Mat*) lrgba; 

如果mRgba是一个指向要克隆的垫子,为什么不?:

Mat *rgbMat = new Mat(*mRgba); 
+0

文档中说'范围'有'mat m'每个维度的范围。在你的情况下,如果'm'不是一维的,你可能会遇到问题。 – 2013-03-11 10:54:03

+0

应该是'Mat * rgbMat = new Mat(bgraMat,rAll);',而不是'&rAll'。 – 2013-03-11 12:07:18

+0

@彼得伍德。谢谢! – qPCR4vir 2013-03-11 16:31:07