簡體   English   中英

從QByteArray創建一個正確的cv :: Mat,其中包含YUV420p框架

[英]Create a proper cv::Mat from QByteArray, containing YUV420p frame

我有一個.yuv文件,其中包含YUV420p格式的幀560x320,我想通過使用opencv將每個幀解碼為RGB來播放它。 我算了一下,一幀的大小必須為268800字節(560x320x12位/ 8,因為YUV420p每個像素有12位)。

所以我打開文件並逐幀讀取它,將每個268800字節存儲在QByteArray中:

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();

為什么您的行是560 + 280? 因為560出現致命錯誤,我不知道為什么。然后我在互聯網上找到了以下代碼段:

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)。 突然,它可以正常工作,視頻播放良好,但是所有幀看起來像這樣:

在此處輸入圖片說明

它甚至有錯誤的分辨率。

.yuv文件中的原始框架如下所示: 在此處輸入圖片說明

我玩過另一種Mat尺寸,是的,它會影響圖像的正確顯示方式,但我無法達到原始幀的外觀。 如何正確地從QByteArray創建Mat? 如何計算合適的墊子尺寸?

找到的解決方案:cv :: Mat行和列必須為cv::Mat yuvImg = cv::Mat(320+320/2,560,CV_8UC1,sendBuffer.data()); 而不是560+280,320 奇怪的是,它使用8位設置正確解碼了12位圖像,但其工作完美

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM