opencv将Mat的submat设置为另一个Mat

时间:2013-05-14 15:37:59

标签: image opencv image-processing

我在使用setTo()方法时遇到问题。我的代码如下:

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,type(),_ 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方法)atg.opencv.core .Mat.setTo(Mat.java:2164)*

我想做的很简单: 一次拍摄一张图像,将其写入合成图像,将列向右移动,依此类推。由于它们具有相同的尺寸,因此应该是可能的。 有人可以指出为什么这不起作用?

1 个答案:

答案 0 :(得分:3)

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

另一件事,我改变的是,我使用copyTo()方法写入组合图像的子矩阵,因此for循环内的代码变为:

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