如何将ARGB Android图像格式转换为RGB图像格式以便在opencv中使用?
How to change ARGB Android image format into RGB image format to be used in opencv?
我在 android
中有一个 ARGB 格式的位图
Bitmap bitmapRGB=Bitmap.createBitmap(capturedImageMat.cols(),capturedImageMat.rows(),Bitmap.Config.ARGB_8888);
我将此图像发送到 Android NDK 部分以在 C++ 中使用 Opencv libaray 处理图像。现在我想把ARGB格式改成RGB格式,然后再改成BGR,因为Opencv使用的是BGR格式。起初我想在 opencv 中使用 cvtColor 方法进行更改,但是没有 ARGB2RGB 转换。我还尝试查看 opencv 团队如何在 github 中更改 BGRA2BGR 并基于此编写代码来更改 ARGB2RGB 但我无法在 opencv 源代码中找到该函数。
感谢opencv中的Alexander i swapped the image channels using mixChannels方法。当我们使用 bitmapToMat 方法时,android 的 ARGB 图像格式在 opencv mat 中被更改为 RGBA 图像格式。我用来将 RGBA 图像格式分成两个不同图像的代码,即 RGB 和 A
cv::Mat inputImage = *(cv::Mat *) inputImageAddress_;
cv::Mat inputImageBGR(inputImage.rows, inputImage.cols,CV_8UC3);
cv::Mat inputImageALPHA(inputImage.rows, inputImage.cols,CV_8UC1);
int from_to[]={0,2, 1,1, 2,0, 3,3};
Mat out[]={inputImageBGR,inputImageALPHA};
cv::mixChannels(&inputImage,1,out,2,from_to,4);
正如@Yirga 指出的那样,OpenCV 的 Utils.bitmapToMat()
默认将 ARGB8888
位图转换为 RGBA
Mat。
因此,将 ARGB8888
Android 位图转换为 RGB
OpenCV Mat 的完整 Java 解决方案为:
Bitmap imageFromAndroid = ... ; // Whatever you have
Mat cvMatRGB = new Mat();
Utils.bitmapToMat(imageFromAndroid, cvMatRGB);
Imgproc.cvtColor(cvMatRGB, cvMatRGB, Imgproc.COLOR_RGBA2RGB);
进口:
import android.graphics.Bitmap;
import org.opencv.core.Mat;
import org.opencv.android.Utils;
import org.opencv.imgproc.Imgproc;
我在 android
中有一个 ARGB 格式的位图 Bitmap bitmapRGB=Bitmap.createBitmap(capturedImageMat.cols(),capturedImageMat.rows(),Bitmap.Config.ARGB_8888);
我将此图像发送到 Android NDK 部分以在 C++ 中使用 Opencv libaray 处理图像。现在我想把ARGB格式改成RGB格式,然后再改成BGR,因为Opencv使用的是BGR格式。起初我想在 opencv 中使用 cvtColor 方法进行更改,但是没有 ARGB2RGB 转换。我还尝试查看 opencv 团队如何在 github 中更改 BGRA2BGR 并基于此编写代码来更改 ARGB2RGB 但我无法在 opencv 源代码中找到该函数。
感谢opencv中的Alexander i swapped the image channels using mixChannels方法。当我们使用 bitmapToMat 方法时,android 的 ARGB 图像格式在 opencv mat 中被更改为 RGBA 图像格式。我用来将 RGBA 图像格式分成两个不同图像的代码,即 RGB 和 A
cv::Mat inputImage = *(cv::Mat *) inputImageAddress_;
cv::Mat inputImageBGR(inputImage.rows, inputImage.cols,CV_8UC3);
cv::Mat inputImageALPHA(inputImage.rows, inputImage.cols,CV_8UC1);
int from_to[]={0,2, 1,1, 2,0, 3,3};
Mat out[]={inputImageBGR,inputImageALPHA};
cv::mixChannels(&inputImage,1,out,2,from_to,4);
正如@Yirga 指出的那样,OpenCV 的 Utils.bitmapToMat()
默认将 ARGB8888
位图转换为 RGBA
Mat。
因此,将 ARGB8888
Android 位图转换为 RGB
OpenCV Mat 的完整 Java 解决方案为:
Bitmap imageFromAndroid = ... ; // Whatever you have
Mat cvMatRGB = new Mat();
Utils.bitmapToMat(imageFromAndroid, cvMatRGB);
Imgproc.cvtColor(cvMatRGB, cvMatRGB, Imgproc.COLOR_RGBA2RGB);
进口:
import android.graphics.Bitmap;
import org.opencv.core.Mat;
import org.opencv.android.Utils;
import org.opencv.imgproc.Imgproc;