2017-12-29 44 views
0

私は、YUV420pフォーマットのフレーム560x320を含んでいます。 1フレームのサイズは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の各268800のバイトを格納し、ファイルを開くと、それはフレームごとに読んで? 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

。私は別のマットサイズウィットを果たしたとはい、それは画像が表示されているか、適切にafffectsが、私は元のフレームの外観を達することができない enter image description here

:.yuvファイル内

オリジナルフレームは、次のようになります。 QByteArrayからMatを正しく作成する方法は?適切なマットサイズを数えるには?

+0

あなたのマットの高さと幅が間違っています。 – Silencer

+0

画像フォーマット(チャンネル)を確認してください - あなたが見ているエラーは、例えばRGBAとしてRGBAマットを表示しようとするようなものです。それはあなたの画像の幅と高さを台無しにする可能性がありますまた、あなたが見ているピクセルでこの混乱の原因となる... –

+0

@ Silencer、どのように右にカウントするには? –

答えて

0

設立されたソリューション: cv :: Matの行と列は560+280,320ではなくcv::Mat yuvImg = cv::Mat(320+320/2,560,CV_8UC1,sendBuffer.data());でなければなりません。 8bitの設定で12bitイメージを正しくデコードしても動作が完璧であることが不思議です

関連する問題