使用ROI加入不同大小的图像

时间:2017-11-08 20:46:36

标签: java opencv opencv3.3

在第一次接触Java OpenCV(3.3.1,windows 8 x64)时,我尝试动态加入两个不同大小的图像和ROI。这里有一些我的代码:

Mat _mat = Utils.imageFileToMat(new File("angelina_jolie.jpg")); //Angelina's face
Mat grayMat = new Mat();
Imgproc.cvtColor(_mat, grayMat, Imgproc.COLOR_BGR2GRAY);
Rect rect = new Rect(new Point(168, 104), new Point(254, 190)); //Angelina's eye ROI
Mat truncated = _mat.submat(rect); //Angelina's eye mat

Mat merge = _mat.clone();
truncated.copyTo(merge);

//show _mat
//show truncated
//show merge

我想看到的是安吉丽娜朱莉,她注视着灰度。

我看到的只是断言或截断的图像(只是眼睛)。

我尝试了copyTo(mat, mask)setOf以及很多事情,但总是得到一个新的断言。

我应该将截断的大小更改为mat的大小以匹配大小吗?我怎么能以编程方式做到这一点?

1 个答案:

答案 0 :(得分:1)

Mat::copyTo文档:

  

该方法将矩阵数据复制到另一个矩阵。复制前   数据,方法调用:

m.create(this->size(),this->type());
  

以便重新分配目标矩阵   如果需要的话。而m.copyTo(m);完美无瑕,功能没有   处理源和之间部分重叠的情况   目的地矩阵。

     

当指定操作掩码时,如果显示Mat :: create调用   上面重新分配矩阵,新分配的矩阵是   在复制数据之前用全零初始化。

     

@param m   目的地矩阵。如果之前没有合适的尺寸或类型   操作,重新分配。

由于您的src和dst图像不具有相同的大小和通道,因此目标图像将重新分配并使用零进行初始化。为避免这种情况,请确保两个图像具有相同的尺寸和通道数。

Imgproc.cvtColor(grayMat, grayMat, Imgproc.COLOR_GRAY2BGR);

现在创建一个面具:

Mat mask = new Mat(_mat.size(), CvType.CV_8UC1, new Scalar(0));
Imgproc.rectangle(mask, new Point(168, 104), new Point(254, 190),new Scalar(255));
// copy gray to _mat based on mask
Mat merge = _mat.clone();
grayMat.copyTo(merge,mask);