Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/191.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在android版OpenCV上转换灰色(单色)ROI?_Android_Opencv - Fatal编程技术网

如何在android版OpenCV上转换灰色(单色)ROI?

如何在android版OpenCV上转换灰色(单色)ROI?,android,opencv,Android,Opencv,如何在OpenCV for android上转换灰色(单色)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.CO

如何在OpenCV for android上转换灰色(单色)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;
}


}

上述代码中的问题是,您试图将单通道Mat(灰色)复制到多通道Mat(RGBA)

所以,在复制回原始RGBA图像之前,需要将灰度转换为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;
}

哈里斯发现问题是对的,但他提供的解决方案是不必要的。在原始代码中,无需将
sub
复制回
image
,此行:

//sub.copyTo(image.submat(roi));
因为这样更改
sub

Imgproc.cvtColor(sub, sub, Imgproc.COLOR_RGBA2GRAY, 4);
也将改变
图像
。之所以会出现这种情况,是因为调用
submat
不会创建新图像,它只会使用原始
图像创建一个参考区域

因此,要在彩色图像中有一个灰色区域,您需要做的就是:

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个通道

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);