2014-05-20 6 views
2

YUV420_SP_NV21 이미지는 Android 미리보기 프레임에서 가져온 바이트 배열 (헤더 없음)로 표시되며이를 RGB 이미지로 디코딩해야합니다. 내가 파이썬에서 같은 일을 시도했습니다Python에서 YUV 이미지 디코딩 OpenCV

convert_mYuv = new Mat(height + height/2, width, CvType.CV_8UC1); 
convert_mYuv.put(0, 0, data); 
Imgproc.cvtColor(convert_mYuv, convert_mRgba, type, channels); 

: 나는 안드로이드에 이런 짓을 한 는 자바와 OpenCV4Android 사용하기 전에 애플 리케이션

nmp = np.array(byteArray, dtype=np.ubyte) RGBMatrix = cv2.cvtColor(nmp, cv2.COLOR_YUV420P2RGB)

,하지만 RGBMatrix는 None 남아있다.

저는 이것을 직접 할 수있는 가능성을 알고 있습니다. 공식에 익숙하지만 실제로 OpenCV 방식으로 기꺼이 할 수 있습니다. 어떻게이 작업을 수행 할 수 있습니까?

나는 또한 cv2.imdecode()을 시도했지만 실패했기 때문에 아마도 사용하지 않아서 가능할 수도 있습니다.

답변

0

이 문제를 해결 한 이래로 얼마 지나지 만이 질문을 업데이트 할 시간이 없었습니다.

YUV420_SP_NV21 바이트 배열을 numpy를 사용하여 전체 축소 YUV 이미지 (내 경우에는 1280x720)로 추출한 다음 OpenCV를 사용하여 RGB로 변환합니다. YY ... YVUVUVU ... VU, 하지만, 다른 YUV 형식 코드에 미묘한 변화가 필요합니다 :

import cv2 as cv2  # OpenCV import 
    def YUVtoRGB(byteArray): 

     e = 1280*720 
     Y = byteArray[0:e] 
     Y = np.reshape(Y, (720,1280)) 

     s = e 
     V = byteArray[s::2] 
     V = np.repeat(V, 2, 0) 
     V = np.reshape(V, (360,1280)) 
     V = np.repeat(V, 2, 0) 

     U = byteArray[s+1::2] 
     U = np.repeat(U, 2, 0) 
     U = np.reshape(U, (360,1280)) 
     U = np.repeat(U, 2, 0) 

     RGBMatrix = (np.dstack([Y,U,V])).astype(np.uint8) 
     RGBMatrix = cv2.cvtColor(RGBMatrix, cv2.COLOR_YUV2RGB, 3) 

내 원시 데이터는이 같은 디코드 인, YUV420_SP_NV21했다.

관련 문제