KWT*_*KWT 2 rgb android opencv converter yuv
如果我尝试在onPreviewFrame(byte []数据,相机相机)中使用Imgproc.cvtColor(mYUV_Mat,mRgba_Mat,Imgproc.COLOR_YUV420sp2RGBA,4)将相机预览YUV字节数组转换为RGB(A)字节数组,则会出现运行时错误:
Preview.java:
mCamera.setPreviewCallback(new PreviewCallback() {
public void onPreviewFrame(byte[] data, Camera camera)
{
// Pass YUV data to draw-on-top companion
System.arraycopy(data, 0, mDrawOnTop.mYUVData, 0, data.length);
mDrawOnTop.invalidate();
}
});
Run Code Online (Sandbox Code Playgroud)
DrawOnTop.java:
public class DrawOnTop extends View {
Bitmap mBitmap;
Mat mYUV_Mat;
protected void onDraw(Canvas canvas) {
if (mBitmap != null)
{
canvasWidth = canvas.getWidth();
canvasHeight = canvas.getHeight();
int newImageWidth = 640;
int newImageHeight = 480;
marginWidth = (canvasWidth - newImageWidth)/2;
if( mYUV_Mat != null ) mYUV_Mat.release();
//mYUV_Mat = new Mat( newImageWidth, newImageHeight, CvType.CV_8UC1 );
mYUV_Mat = new Mat( newImageWidth, newImageHeight, CvType.CV_8UC4 );
mYUV_Mat.put( 0, 0, mYUVData );
//Mat mRgba_Mat = new Mat();
Mat mRgba_Mat = new Mat(newImageWidth,newImageHeight,CvType.CV_8UC4);
//Mat mRgba_Mat = mYUV_Mat;
//Imgproc.cvtColor( mYUV_Mat, mRgba_Mat, Imgproc.COLOR_YUV2RGBA_NV21, 4 );
//Imgproc.cvtColor( mYUV_Mat, mRgba_Mat, Imgproc.COLOR_YUV420sp2RGB, 4 );
Imgproc.cvtColor( mYUV_Mat, mRgba_Mat, Imgproc.COLOR_YUV420sp2RGBA, 4 );
// Draw Bitmap New:
Bitmap mBitmap = Bitmap.createBitmap( newImageWidth, newImageHeight, Bitmap.Config.ARGB_8888 );
Utils.matToBitmap( mRgba_Mat, mBitmap );
mRgba_Mat.release();
}
}
Run Code Online (Sandbox Code Playgroud)
转换mYUV_Mat.put(0,0,mYUVData)正确运行.但是尝试使用Imgproc.cvtColor将mYUV_Mat转换为mRgb_Mat会导致所有运行时错误(使用Eclipse找不到"Source not found.").
什么是正确的Imgproc.cvtColor命令为我的目标?
(我不想使用Java YUV2RGB(A)解码方法,因为它会减慢图像处理速度.我想使用OpenCV Imgproc.cvtColor方法,因为我可以进行本机调用)
也许Imgproc图书馆未正确包含在您的项目中,但其他OpenCV库是?崩溃的行是您使用方法的第一行Imgproc,这可以解释为什么代码的早期部分正确运行.
您的代码看起来很好,除了您可以使用无参数构造函数mRgba_Mat(因为大多数OpenCV4Android函数,包括cvtColor,可以推断目标矩阵的所需大小),并且您为此分配了大量浪费的空间mYUV_Mat.如果只是为YUV矩阵分配比RGB对应物多50%的空间,则不需要完整的4个通道:
mYUV_Mat = new Mat( newImageHeight + newImageHeight / 2, newImageWidth, CvType.CV_8UC1 );
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9039 次 |
| 最近记录: |