如何在OpenCV for for?上转换灰色(单色)ROI?
我试试,但它不起作用:
public Mat onCameraFrame(CvCameraViewFrame inputFrame) {
Mat image = inputFrame.rgba();
Rect roi = new Rect(300, 50, 50, 10);
Mat sub =image.submat(roi);
Imgproc.cvtColor(sub, sub, Imgproc.COLOR_RGBA2GRAY);
sub.copyTo(image.submat(roi));
return image;
}
和
public Mat onCameraFrame(CvCameraViewFrame inputFrame) {
Mat image = inputFrame.rgba();
Rect roi = new Rect(300, 50, 50, 10);
Mat sub =image.submat(roi);
Imgproc.cvtColor(sub, sub, Imgproc.COLOR_RGBA2GRAY);
sub.copyTo(image.submat(roi));
return image;
}
答案 0 :(得分:0)
上面代码中的问题是你试图将单通道Mat(GRAY)复制到多通道Mat(RGBA)。
因此,在复制回原始RGBA图像之前,您需要将GRAY转换为RGBA。
将您的代码更改为
public Mat onCameraFrame(CvCameraViewFrame inputFrame) {
Mat image = inputFrame.rgba();
Rect roi = new Rect(300, 50, 50, 10);
Mat sub =image.submat(roi);
Imgproc.cvtColor(sub, sub, Imgproc.COLOR_RGBA2GRAY);
Imgproc.cvtColor(sub, sub, Imgproc.COLOR_GRAY2RGBA);
sub.copyTo(image.submat(roi));
return image;
}
答案 1 :(得分:0)
Haris在确定问题时是对的,但他提供的解决方案是不必要的。在原始代码中,您不需要将sub
复制回image
,此行:
//sub.copyTo(image.submat(roi));
因为像这样更改sub
:
Imgproc.cvtColor(sub, sub, Imgproc.COLOR_RGBA2GRAY, 4);
也会改变image
。这是因为调用submat
不会创建新图片,只会创建一个包含原始image
的参考区域。
因此,要在彩色图像中设置灰色区域,您需要的是:
Mat image = inputFrame.rgba();
Rect roi = new Rect(300, 50, 50, 10);
Mat sub = image.submat(roi);
Imgproc.cvtColor(sub, sub, Imgproc.COLOR_RGBA2GRAY, 4);
请注意cvtColor
的最后一个参数,即结果通道数。 Rgba有4个频道。