以下是使用Opencv(适用于Google Glass)的Android应用中的一小段代码。我试图将图像(位置picturePath)从彩色转换为灰度,然后覆盖原始彩色图像。就目前而言,这段代码将图像保存在内存中,应该是半灰度,一半是全黑的:
private void rGBProcessing (final String picturePath, Mat image) {
//BitmapFactory Creates Bitmap objects from various sources,
//including files, streams, and byte-arrays
Bitmap myBitmapPic = BitmapFactory.decodeFile(picturePath);
image = new Mat(myBitmapPic.getWidth(), myBitmapPic.getHeight(), CvType.CV_8UC4);
Mat imageTwo = new Mat(myBitmapPic.getWidth(), myBitmapPic.getHeight(), CvType.CV_8UC1);
Utils.bitmapToMat(myBitmapPic, image);
Imgproc.cvtColor(image, imageTwo, Imgproc.COLOR_RGBA2GRAY);
//Highgui.imwrite(picturePath, imageTwo);
Utils.matToBitmap(imageTwo, myBitmapPic);
FileOutputStream out = null;
try {
out = new FileOutputStream(picturePath);
myBitmapPic.compress(Bitmap.CompressFormat.PNG, 100, out); // bmp is your Bitmap instance
// PNG is a lossless format, the compression factor (100) is ignored
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (out != null) {
out.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
任何人都可以向我解释为什么所产生的图像在一半上是完全黑的,并建议我进行修正。在我看来,由于图像处理的过程已经部分完成,或许在下一个代码开始之前有一段代码没有完成的问题?任何帮助表示赞赏。 干杯!
更新:这是我所看到的:
谷歌眼镜上的图片是黑色的,但这个上传只是切断了下半部分。不久之后,即使应用程序不再出现在屏幕上(我也不知道如何停止调试,所以它仍然可以在后台工作。然后我得到完整的灰度图像。有人可以解释发生了什么,请给我一个潜在的解决方案吗?
答案 0 :(得分:0)
图像的Alpha通道可能会链接到RGB值。有两种不同的方式可以考虑透明度:
传统Alpha混合,将透明度定义为:
数学:blend(source, dest) = (source.rgb * source.a) + (dest.rgb * (1 - source.a))
在这个世界中,RGB和alpha是独立的。你可以改变一个而不影响另一个。即使对象完全透明,它仍然具有相同的RGB,就像它是不透明的一样。
预乘Alpha混合
数学:blend(source, dest) = source.rgb + (dest.rgb * (1 - source.a))
在这个世界中,RGB和alpha是相互关联的。要使对象透明,您必须减少其RGB(以减少颜色)以及它的alpha(以减少其背后的任何内容)。完全透明的对象不再具有任何RGB颜色,因此只有一个值表示100%透明度=> RGB和alpha全为零与您的情况一样。
OpenCV bitmapToMat()
提供了将预乘Alpha混合转换为常规Alpha混合的机会。尝试使用:
Utils.bitmapToMat(myBitmapPic, image, true);
只需注释:bitmapToMat()
如果需要,可以重新分配输出Mat
对象,因此它可能为空。所以如果image
,你不应该关心分配。