programacion - convertir Bitmap a Mat después de capturar la imagen con la cámara de Android
manual de programacion android pdf (4)
Mat b = new Mat();
Bitmap bmp = getIntent().getExtras().getParcelable("image_send");
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_display_image);
Mat tmp = new Mat (bmp.getWidth(), bmp.getHeight(), CvType.CV_8UC1);
Utils.bitmapToMat(bmp, tmp);
Imgproc.cvtColor(tmp, tmp, Imgproc.COLOR_RGB2GRAY);
//Imgproc.cvtColor(tmp, tmp, Imgproc.COLOR_GRAY2RGB, 4);
Utils.matToBitmap(tmp, bmp);
iv = (ImageView) findViewById(R.id.imageView1);
iv.setImageBitmap(bmp);
}
No se puede mostrar el bmp. Mi aplicación se ha detenido después de tomar una foto.
Con Camera2
esta tarea es muy rápida, solo necesita configurar ImageReader
con ImageFormat
en YUV_420_888
y luego YUV_420_888
marcos con OpenCV
esta manera:
// You can read image with differents patterns for example grayscale:
Mat mGray(height, width, cv::IMREAD_GRAYSCALE, pFrameData);
Una implementación completa en la siguiente respuesta: https://.com/a/49331546/471690
El mismo problema con mi aplicación. En la actividad principal, tuve que hacer OpenCV utilizable. (Supongo que su aplicación generó un error de enlace cuando se utilizó la biblioteca Mat). Todas las aplicaciones de muestra hacen esto. Incluye esta tu actividad principal.
private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {
@Override
public void onManagerConnected(int status) {
switch (status) {
case LoaderCallbackInterface.SUCCESS:
{
Log.i("OpenCVManager setup", "OpenCV loaded successfully");
//Use openCV libraries after this
} break;
default:
{
super.onManagerConnected(status);
} break;
}
}
};
@Override
public void onResume()
{
super.onResume();
OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_9, this,
mLoaderCallback);
}
Utils.bitmapToMap
requiere un mapa de bits de tipo ARGB_8888
o RGB_565
.
import org.opencv.android.Utils;
Mat mat = new Mat();
Bitmap bmp32 = bmp.copy(Bitmap.Config.ARGB_8888, true);
Utils.bitmapToMat(bmp32, mat);
Mat tmp = new Mat (bmp.getWidth(), bmp.getHeight(), CvType.CV_8UC1);
OpenCV Mat constructor espera filas, pares de pares en lugar de ancho, altura como sus argumentos, inviértalos.
Tratar:
Mat tmp = new Mat (bmp.getHeight(), bmp.getWidth(), CvType.CV_8UC1);