我有一个电视捕捉卡,有一个输入作为YUV格式。我在这里看到了类似于这个问题的其他帖子,并试图尝试每一种可能的方法,但它们都没有提供一个清晰的图像。目前,最好的结果是使用OpenCV cvCvtColor(scr, dst, CV_YUV2BGR)
函数调用。
我目前还不知道YUV的格式,老实说,这让我有点困惑,因为它看起来像是存储了4个频道,但只有3个?我已经包括了一张照片,从捕捉卡,希望有人能够理解可能正在发生的事情,我可以用来填补空白。
提要是通过DeckLink强度Pro卡进入,并在C++应用程序中在Windows 7环境中使用OpenCV进行访问。
更新
我看过维基百科一篇关于这些信息的文章,并试图在我的应用程序中使用这个公式。下面是包含输出的代码块。任何建议都是非常感谢的。
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);
}
发布于 2018-11-18 04:24:42
我使用以下C++代码使用OpenCV进行,将yuv数据(YUV_NV21)转换为rgb映像(BGR in OpenCV)
int main()
{
const int width = 1280;
const int height = 800;
std::ifstream file_in;
file_in.open("../image_yuv_nv21_1280_800_01.raw", std::ios::binary);
std::filebuf *p_filebuf = file_in.rdbuf();
size_t size = p_filebuf->pubseekoff(0, std::ios::end, std::ios::in);
p_filebuf->pubseekpos(0, std::ios::in);
char *buf_src = new char[size];
p_filebuf->sgetn(buf_src, size);
cv::Mat mat_src = cv::Mat(height*1.5, width, CV_8UC1, buf_src);
cv::Mat mat_dst = cv::Mat(height, width, CV_8UC3);
cv::cvtColor(mat_src, mat_dst, cv::COLOR_YUV2BGR_NV21);
cv::imwrite("yuv.png", mat_dst);
file_in.close();
delete []buf_src;
return 0;
}
转换后的结果类似于图像yuv.png。
https://stackoverflow.com/questions/7954416
复制相似问题