[英]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)。 突然,它可以正常工作,視頻播放良好,但是所有幀看起來像這樣:
它甚至有錯誤的分辨率。
我玩過另一種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.