【问题标题】:opencv setting submat of Mat to another Matopencv将Mat的子垫设置为另一个Mat
【发布时间】:2013-05-08 23:33:45
【问题描述】:

我在使用 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,线程“main”中的第 348 行异常 CvException [org.opencv.core.CvException:......\src\opencv\modules\core\src\copy.cpp :348: 错误: (-215) checkScalar(value, type(), _value.kind(), _InputArray::MAT )] at org.opencv.core.Mat.n_setTo(Native Method) at org.opencv.core。 Mat.setTo(Mat.java:2164)*

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

【问题讨论】:

  • 我发现了我的错误。组合的 Mat 应该像这样初始化:“Mat combinedImagesOfSameSize = new Mat(new Range(0,30), new Range(0,100*someImagesOfSameSize.size()),CvType.CV_8UC3);"想把 3 放在那里读 3 通道 png。
  • 您可以post and accept您的解决方案作为答案。更容易判断您的问题已解决。
  • 我会在2天内接受答案

标签: image opencv image-processing


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-27
    • 2014-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多