我有一个电视采集卡,有一个YUV格式的输入.我在这里看到过与此问题类似的其他帖子并试图尝试所有可能的方法,但它们都没有提供清晰的图像.目前最好的结果是使用OpenCV cvCvtColor(scr, dst, CV_YUV2BGR)函数调用.
我目前还没有意识到YUV格式,说实话让我感到困惑,因为它看起来像存储4个频道,但只有3个?我已经从捕获卡中包含了一张图像,希望有人能够理解我可能用来填补空白的内容.

Feed通过DeckLink Intensity Pro卡进入,并在Windows 7环境中使用OpenCV在C++应用程序中访问.
更新
我查看了有关此信息的维基百科文章,并尝试在我的应用程序中使用该公式.下面是从中收到输出的代码块.任何意见是极大的赞赏.
BYTE* pData;
videoFrame->GetBytes((void**)&pData);
m_nFrames++;
printf("Num Frames executed: %d\n", m_nFrames);
for(int i = 0; i < 1280 * 720 * 3; i=i+3)
{
m_RGB->imageData[i] = pData[i] + pData[i+2]*((1 - 0.299)/0.615);
m_RGB->imageData[i+1] = pData[i] - pData[i+1]*((0.114*(1-0.114))/(0.436*0.587)) - pData[i+2]*((0.299*(1 - 0.299))/(0.615*0.587));
m_RGB->imageData[i+2] = pData[i] + pData[i+1]*((1 - 0.114)/0.436);
}
Run Code Online (Sandbox Code Playgroud)

我有一个视频engine2.avi,我想用openCV阅读和展示.这是我的代码:
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
using namespace cv;
int main(int argc, char** argv)
{
string filename = "D:\\BMDvideos\\engine2.avi";
VideoCapture capture(filename);
Mat frame;
if( !capture.isOpened() )
throw "Error when reading steam_avi";
namedWindow("w", 1);
for( ; ; )
{
capture >> frame;
//if(!frame)
// break;
imshow("w", frame);
waitKey(20); // waits to display frame
}
waitKey(0);
}
Run Code Online (Sandbox Code Playgroud)
如果我的文件有编解码器YUV 4:2:2 (UYVY)(我使用Direct-Show录制视频),此代码不起作用,但是当我使用视频时,我可以使用openCV!
有谁知道这是如何工作的?
更新:
在阅读了一些链接后,建议捕获异常将解决问题,我修改了我的代码.它没有帮助,但这里是修改后的代码:
cv::VideoCapture cap("d:\\BMDvideos\\engine2.avi");
cv::Mat frame;
try
{
cap >> frame;
}
catch(cv::Exception ex)
{
std::cout …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用OpenCV将YUV图像转换为RGB.我是一个完整的新手.我创建了一个函数,它将YUV图像作为源并将其转换为RGB.它是这样的:
void ConvertYUVtoRGBA(const unsigned char *src, unsigned char *dest, int width, int height)
{
cv::Mat myuv(height + height/2, width, CV_8UC1, &src);
cv::Mat mrgb(height, width, CV_8UC4, &dest);
cv::cvtColor(myuv, mrgb, CV_YCrCb2RGB);
return;
}
Run Code Online (Sandbox Code Playgroud)
这有用吗?我是否需要将Mat转换为char*?我很遗憾,任何帮助都将不胜感激.