2013-05-14 138 views
2

我在使用setTo()方法时遇到问题。我的代码如下:opencv将mat的子设置为另一个mat

ArrayList<Mat> someImagesOfSameSize = new ArrayList<Mat>; 
someImagesOfSameSize.add(img1); 
someImagesOfSameSize.add(img3); 
someImagesOfSameSize.add(img3); 
Mat combinedImagesOfSameSize = new Mat(new Range(0,30), new Range(0,100*someImagesOfSameSize.size()),3); 
Mat tempImage = null; 
for(int i = 0; someImagesOfSameSize.size();i++){ 
    tempImage = someImagesOfSameSize.get(i); 
    combinedImagesOfSameSize.submat(new Range(0,30), new Range(i*100,(i+1)*100)).setTo(tempImage) 
} 

它给了我下面的OpenCV的错误:

* OpenCV的错误:断言失败(checkScalar(值,类型(),_value.kind(),_InputArray :: MAT))
未知函数,文件...... \ src \ opencv \ modules \ core \ src \ copy.cpp,第348行线程中的异常“main”CvException [org.opencv.core.CvException:.. .... \ src \ opencv \ modules \ core \ src \ copy.cpp:348:错误:(-215)checkScalar(value,type(),_value.kind(),_InputArray :: MAT)] org。 opencv.core.Mat.n_setTo(Native Method)at org.opencv.core.Mat.setTo(Mat.java:2164)*

我想要做的事情很简单: 一次拍摄一张图像,将它写入合成图像,将列移到右侧等等。由于它们尺寸完全相同,因此应该可以。 有人能指出为什么这不起作用吗?

+0

我发现我的错。 “Mat combinedImagesOfSameSize = new Mat(新范围(0,30),新范围(0,100 * someImagesOfSameSize.size()),CvType.CV_8UC3);”组合Mat应该像这样初始化:认为把一个3读取一个3频道PNG。 – kiltek 2013-05-14 16:15:31

+0

您可以[发布并接受](http://meta.stackexchange.com/questions/17463/can-i-answer-my-own-questions-even-those-where-i-knew-the-answer-before - 问)你的解决方案作为答案。它可以更容易地告诉你的问题已经解决。 – Aurelius 2013-05-14 16:27:59

+0

我会在2天内接受答案 – kiltek 2013-05-14 16:55:07

回答

3

在研究了OpenCV的Java API的更彻底地我发现,该构造器Mat(Range rowRange, Range colRange, int type)是我的代码误用,因为“类型”这里指的CvType。这意味着我必须提供Mat将要类似的图像类型。我将此值设置为“CvType.CV_8UC3”,因为我的“someImagesOfSameSize”图像是3通道8位png文件。

另一件事,即我已经改变是,我使用的CopyTo从() - 方法写入到组合图像的子矩阵,所以内部的代码为循环变化:

tempSameSizeImage.copyTo(combinedSameSizeImages.submat(
       new Range(0, 61), new Range(i * 160, (i + 1) * 160)));