Qwidget上显示海康监控视频,如何在视频上层绘图并且不闪烁

徐大大平凡之路 2020-10-16 07:24:47
请问下关于Qt的问题。
期望实现的效果:Qwidget上显示海康监控视频,然后可以在视频上绘制动态矩形框。
现在的做法是:
1、把Qwidget的handle 传给海康监控相机sdk,把视频流显示到Qwidget上。 HWND handle = HWND(this->winId());
2、重写paintEvent(QPaintEvent* event)函数,绘制矩形。
现在遇到的问题是:视频一直在闪烁。
有什么办法,可以在视频上绘制矩形框,并且不闪烁。
参考链接:
https://www.jianshu.com/p/04dd5b892a48
https://blog.csdn.net/u011430225/article/details/75952697
...全文
6852 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
doan chan 2023-09-11
  • 打赏
  • 举报
回复

void CALLBACK fDrawFun(LONG realhandle, HDC hdc, DWORD dwuse)
{
// TODO 画框
}
sdk:
NET_DVR_RigisterDrawFun(lRealPlayHandle, fDrawFun,NULL)

攀是一种状态 2021-12-09
  • 打赏
  • 举报
回复

请问找到合适的解决方法了吗,楼主

xqhrs232 2020-10-18
  • 打赏
  • 举报
回复
学习大神的技术
  • 打赏
  • 举报
回复
我试过了。 但是 叠加在 视频上面的 widget,无论如何都没法设置为透明的效果。 所以,视频上就是有一个 被遮盖的效果。
攀是一种状态 2021-12-09
  • 举报
回复
@徐大大平凡之路 大佬有合适的解决方法了吗,我也遇到这个问题了
  • 打赏
  • 举报
回复
引用 4 楼 戏言zare 的回复:
我给你看看我的例子吧 InitLogin(); LoginDevice(CameraIP,CameraUser,CameraPWD); void MainForm::InitLogin() { NET_DVR_Init(); //设置连接时间与重连时间 NET_DVR_SetConnectTime(2000, 1); NET_DVR_SetReconnect(10000, true); } void MainForm::LoginDevice(QString ip, QString user, QString pwd) { NET_DVR_USER_LOGIN_INFO struLoginInfo = {0}; struLoginInfo.bUseAsynLogin = 0; //同步登录方式 strcpy(struLoginInfo.sDeviceAddress, ip.toLatin1().data()); //设备IP地址 struLoginInfo.wPort = 8000; //设备服务端口 strcpy(struLoginInfo.sUserName, user.toLatin1().data()); //设备登录用户名 strcpy(struLoginInfo.sPassword, pwd.toLatin1().data()); //设备登录密码 //设备信息, 输出参数 NET_DVR_DEVICEINFO_V40 struDeviceInfoV40 = {0}; LONG lUserID; lUserID = NET_DVR_Login_V40(&struLoginInfo, &struDeviceInfoV40); if (lUserID < 0) { NET_DVR_Cleanup(); return; } NET_DVR_PREVIEWINFO struPlayInfo = {0}; struPlayInfo.hPlayWnd = (HWND)ui->widview->winId(); //需要SDK解码时句柄设为有效值,仅取流不解码时可设为空 struPlayInfo.lChannel = 1; //预览通道号 struPlayInfo.dwStreamType = 0; //0-主码流,1-子码流,2-码流3,3-码流4,以此类推 struPlayInfo.dwLinkMode = 0; //0- TCP方式,1- UDP方式,2- 多播方式,3- RTP方式,4-RTP/RTSP,5-RSTP/HTTP struPlayInfo.bBlocked = 1; //0- 非阻塞取流,1- 阻塞取流 viewnow = NET_DVR_RealPlay_V40(lUserID, &struPlayInfo, NULL, NULL); }
你的这段代码是 如何获取海康监控视频,并把视频显示到 ui->widview 我现在 还想在ui->widview上绘制矩形框。
  • 打赏
  • 举报
回复
你的这段代码是 如何获取海康监控视频,并把视频显示到 ui->widview
  • 打赏
  • 举报
回复
我给你看看我的例子吧 InitLogin(); LoginDevice(CameraIP,CameraUser,CameraPWD); void MainForm::InitLogin() { NET_DVR_Init(); //设置连接时间与重连时间 NET_DVR_SetConnectTime(2000, 1); NET_DVR_SetReconnect(10000, true); } void MainForm::LoginDevice(QString ip, QString user, QString pwd) { NET_DVR_USER_LOGIN_INFO struLoginInfo = {0}; struLoginInfo.bUseAsynLogin = 0; //同步登录方式 strcpy(struLoginInfo.sDeviceAddress, ip.toLatin1().data()); //设备IP地址 struLoginInfo.wPort = 8000; //设备服务端口 strcpy(struLoginInfo.sUserName, user.toLatin1().data()); //设备登录用户名 strcpy(struLoginInfo.sPassword, pwd.toLatin1().data()); //设备登录密码 //设备信息, 输出参数 NET_DVR_DEVICEINFO_V40 struDeviceInfoV40 = {0}; LONG lUserID; lUserID = NET_DVR_Login_V40(&struLoginInfo, &struDeviceInfoV40); if (lUserID < 0) { NET_DVR_Cleanup(); return; } NET_DVR_PREVIEWINFO struPlayInfo = {0}; struPlayInfo.hPlayWnd = (HWND)ui->widview->winId(); //需要SDK解码时句柄设为有效值,仅取流不解码时可设为空 struPlayInfo.lChannel = 1; //预览通道号 struPlayInfo.dwStreamType = 0; //0-主码流,1-子码流,2-码流3,3-码流4,以此类推 struPlayInfo.dwLinkMode = 0; //0- TCP方式,1- UDP方式,2- 多播方式,3- RTP方式,4-RTP/RTSP,5-RSTP/HTTP struPlayInfo.bBlocked = 1; //0- 非阻塞取流,1- 阻塞取流 viewnow = NET_DVR_RealPlay_V40(lUserID, &struPlayInfo, NULL, NULL); }
mideum 2020-10-17
  • 打赏
  • 举报
回复
非window(有parent)的QWidget天生就是透明背景的啊,根本不需要设置,不清楚你是怎么搞的
mideum 2020-10-16
  • 打赏
  • 举报
回复
你既然把这个widget的HWND传给sdk了,就不要再在它的paintEvent里面画东西啦
搞一个widget专门传给sdk的,再另外搞一个widget专门用来画矩形的,叠在前面一个上面
攀是一种状态 2022-01-17
  • 举报
回复
@mideum 两个widget只会显示一个,海康摄像头回覆盖掉矩形框,老哥,怎么解决啊

16,818

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧