如何在OpenCV for android上翻译灰色(单色)ROI?

时间:2014-02-04 16:51:07

标签: android opencv

如何在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;

}

2 个答案:

答案 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个频道。