在第一次接触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的大小以匹配大小吗?我怎么能以编程方式做到这一点?
答案 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);