2017-12-29 3 views
0

나는 YUV420p 형식의 프레임 560x320을 포함하고 있으며 각 프레임을 opencv를 사용하여 RGB로 디코딩하여 재생하고자하는 .yuv 파일을 가지고 있습니다. 한 프레임의 크기는 268800 바이트 (YUV420p는 픽셀 당 12 비트를 갖기 때문에 560x320x12 비트/8) 여야합니다.QByteArray에서 적절한 cv :: Mat를 만들고 YUV420p 프레임을 사용하여

qint64 SIZE_OF_YUV420p_FRAME = 268800; 
QByteArray sendBuffer; 

    QFile file("/home/YUVdecoding/small.yuv"); 

if(file.open(QIODevice::ReadOnly)) 
    { 
     while (!file.atEnd()) { 

      sendBuffer = file.read(SIZE_OF_YUV420p_FRAME); //capture one frame 
      cv::Mat yuvImg = cv::Mat(560+280,320,CV_8UC1,sendBuffer.data()); //translating QByteArray to Mat 
      cv::Mat rgbImage; 
      cv::cvtColor(yuvImg,rgbImage,cv::COLOR_YUV420p2RGB);// converting to RGB 
      cv::imshow("bgr",rgbImage); 
      cv::waitKey(30); 
     } 

    } 
    file.close(); 

yuvImg 행이 이유 560 + 280 :

그래서 QByteArray는 각각 268,800 바이트를 저장하는 파일을 개방하고 프레임마다 판독? (560)의 치명적인 오류로, 그리고 내가 인터넷에이 코드를 발견 why.Then 잘 모릅니다 때문에 :
QVideoFrame copy(frame); 
if (frame.isValid() && copy.map(QAbstractVideoBuffer::ReadOnly)) { 
    Mat frameYUV=Mat(copy.height() + copy.height()/2, copy.width(),CV_8UC1, (void*)copy.bits()); 

    Mat frameRGB; 
    cvtColor(frameYUV, frameRGB, CV_YUV2BGRA_I420); 

    imshow("Video", frameRGB); 
} 

그래서 여기에 높이 + 높이/2와 나는 그것을 (560/2 = 280)을 시도했다. 갑자기 작동, 비디오 잘 재생하지만, 모든 프레임이 같은 같습니다 그것은 심지어 잘못된 해상도가

enter image description here

. enter image description here

내가 재치 또 다른 매트 크기를 연주하고 예, 그것은 이미지가 표시되는 방법을 제대로에 afffects,하지만 난 원래의 프레임 모양에 도달 할 수 :

원래 프레임은 .yuv 파일에 다음과 같습니다. QByteArray에서 Mat를 올바르게 만드는 방법은 무엇입니까? 적절한 매트 크기를 계산하는 방법?

+0

매트의 너비와 너비가 잘못되었습니다. – Silencer

+0

이미지 형식 (채널)을 확인하십시오 -보고있는 오류는 예를 들어 RGB로 매트를 표시하려고하는 것과 같습니다. 그건 너의 이미지의 너비와 높이로 엉망이 될 수도 있고, 너는보고있는 픽셀로이 엉망을 만들 수도있다. –

+0

@Silencer, 그래서 어떻게 셀까? –

답변

0

설립 된 솔루션 : cv :: Mat 행과 열은 560+280,320 대신 cv::Mat yuvImg = cv::Mat(320+320/2,560,CV_8UC1,sendBuffer.data());이어야합니다. 8 비트 설정으로 12 비트 이미지를 올바르게 디코딩하지만 작동이 이상하다는 이상한 점

관련 문제