Qt下OpenCv中cvGetWindowHandle的使用

昨天因为OpenCv自带的 cvNamedWindow 功能不多,所以想修饰一下,添加几个控件上去,结果获取不到句柄或指针。试了半天无效,于是就准备放弃,打算自己写一个对话框,但是感觉有点麻烦,而且心里不爽,想解决这个问题,于是今早又试了试,成功了。


尝试了多次使用cvGetWindowHandle来获取视频窗口的句柄,都不成功,是用了包括DestroyWindow、IsWindow、EnumChildWindows在内的多个API,也表示获取到的是无效句柄。cvGetWindowHandle函数的注释上写了:
get native window handle (HWND in case of Win32 and Widget in case of X Window
虽然没怎么看懂,大致意思就是说用win32原生窗口的话,获取到的是HWND句柄,入伙是X Window,那就是X Window,百度了下X Window,感觉还是不对,因为Linux下才是X Window,我现在是在Windows下,为啥不是HWND?不管了试试就知道。
QWidget* cvWidget = (QWidget*)cvGetWindowHandle( m_cvTitle );

然后再获取标题,用qDebug()打印,正确!


既然获取到了QWidget,那么向这个窗口添加控件怎么样?于是添加了一个QPushButton,运行,崩溃。提示在不同的线程中,无法跨线程操作。但是这个函数的实现我是暂时不能改的,最好还是用这个窗口,难道没办法了吗?


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
### 回答1: cvGetWindowHandle未定义是由于OpenCV没有定义该函数所导致的错误。可能是因为您使用的是旧版本的OpenCV库,或者您没有正确地包含OpenCV库的头文件。建议您检查您的代码是否正确包含了OpenCV库的头文件,并尝试更新到最新版本的OpenCV库。 ### 回答2: cvGetWindowHandleOpenCV的一个函数,用于获取指定窗口的窗口句柄(也就是窗口的唯一标识符)。但是,如果程序在调用该函数时出现“未定义”的错误,可能有以下几个原因: 1.未包含必要的头文件 cvGetWindowHandle函数需要使用一些头文件定义的变量和类型,如果程序未包含这些头文件,编译器就无法识别这些未定义的符号,导致函数无法被调用。因此,需要查看程序是否包含了头文件“#include<opencv2/highgui/highgui_c.h>”,如果没有,请添加上。 2.未链接相关库文件 OpenCV是一个跨平台的开源计算机视觉库,它提供了丰富的图像处理和计算机视觉算法,但是使用时还需要将库文件链接到程序去才能正常使用。如果程序未链接相关的库文件,编译器也会提示“未定义”的错误。因此,需要在编译时加上链接选项“-lopencv_highgui”,或者将库文件添加到工程去。 3.函数名称错误 如果程序调用了不存在的函数名称,也会报错“未定义”的错误。因此,需要检查程序调用函数的名称是否与要使用的函数名称一致。在OpenCVcvGetWindowHandle函数已经被更新为cvGetWindowProperty,可以改用这个函数来获取窗口句柄。 总之,出现“cvGetWindowHandle未定义”的错误,需要根据实际情况进行排查,将可能出现错误的原因逐一排除,最终找到错误的根源来解决问题。 ### 回答3: cvGetWindowHandleOpenCV1.x版本的函数,在OpenCV2.x以后的版本,该函数被废弃了,所以导致无法使用。新版OpenCV提供了更好的窗口管理API,如namedWindow和imshow等函数,它们能更好地管理窗口的创建、关闭、显示等操作,而且也更加方便使用和移植。如果需要获取窗口的句柄,可以使用新版OpenCV提供的getWindowHandle函数来代替cvGetWindowHandle函数。 在OpenCV2.x以后的版本,如果仍要使用cvGetWindowHandle函数,可以通过添加opencv_legacy模块来实现。要使用opencv_legacy模块,需要在编译OpenCV时加入--with-legacy参数,此时编译后生成的库将包含该模块的相关函数。但是,不推荐在新的OpenCV程序使用过时的函数,因为它们可能会在将来的版本被移除或不被支持,从而导致程序无法正常工作。 因此,建议在编写新的OpenCV程序时,尽量使用新版API,以保证程序的可移植性和可靠性。如果需要使用cvGetWindowHandle函数,可以使用opencv_legacy模块,但要注意该函数可能会被移除或不被支持的风险。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

撬动未来的支点

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值