从项目的 资源视图 找到 主界面
因为运行后单击左侧的Tree控件结点,即可在预览窗口看到图像,所以查看Tree控件的事件
找到对应.cpp下的该函数
设置断点,跟踪到DblPlayChan(m_iCurDeviceIndex, iIndex, hSelect);
进入该函数,跟踪到StartPlay(&pStruChanInfo, hChanItem)
进入StartPlay函数,跟踪时发现g_bInSide为true,运行StartPlayInsideDecode,如图:
进入函数StartPlayInsideDecode(pChanInfo, hChanItem);
跟踪到回调函数g_RealDataCallBack_V30,在其上方添加转OpenCV Mat的函数,代码如下:
//数据解码回调函数,
//功能:将YV_12格式的视频数据流转码为可供opencv处理的BGR类型的图片数据,并实时显示。
void CALLBACK DecCBFun(long nPort, char* pBuf, long nSize, FRAME_INFO* pFrameInfo, long nUser, long nReserved2)
{
if (pFrameInfo->nType == T_YV12)
{
//std::cout << "the frame infomation is T_YV12" << std::endl;
if (g_BGRImage.empty())
{
g_BGRImage.create(pFrameInfo->nHeight, pFrameInfo->nWidth, CV_8UC3);
}
Mat YUVImage(pFrameInfo->nHeight + pFrameInfo->nHeight / 2, pFrameInfo->nWidth, CV_8UC1, (unsigned char*)pBuf);
cvtColor(YUVImage, g_BGRImage, COLOR_YUV2BGR_YV12);
imshow("RGBImage1", g_BGRImage);
waitKey(1);
YUVImage.~Mat();
}
}
注意:此前需要配置好OpenCV库。并在此添加头文件,定义保存Mat的变量g_BGRImage
修改回调函数g_RealDataCallBack_V30,通过PlayM4_SetDecCallBackExMend调用DecCBFun进行转换
运行效果:
文中转换函数链接:Windows下使用C++调用海康SDK获取视频,用OpenCV显示_持久决心的博客-CSDN博客
另有参考链接:
海康网络摄像机YV12转换为BGR,由opencv Mat显示_shangtao1989的博客-CSDN博客
感谢作者。