在MFC的PictureControl控件中显示opencv Mat格式的图片

       在车牌识别系统easyPR的MFC可视化界面中提到,在待识别车牌的左上角会有一个小窗口来显示车牌识别的中间过程,其中待识别车牌原图是在MFC的PicturControl中显示的,而中间过程是用opencv 处理后的Mat格式的图片,该图片显示在PictureControl的左上角。本文主要记录在picutreControl窗口指定位置显示Mat格式图片的方法以及当前此方案的遗留问题点。

      本方案的源代码地址:https://github.com/livezingy/EasyPR_MFC

testPR_MFC feature

       目前实现的MFC可视化界面中,中间过程包含plate locate, plate judge, plate detect, chars segment,其中plate detect会在源图像中将判定为车牌的部分用不同

plate detect

      1.在picutrecontrol指定位置显示Mat格式图片

      该功能实现时的主要参考资料:在 MFC 框架中,有什么方法能直接将 OpenCV 2.0 库中 Mat 格式的图片传递到 Picture Control(图片控件)显示?

      按照该参考资料的做法,会得到下图所示结果。在还未执行到imshow时,就有一个比较大的灰色窗口覆盖了原图的一部分,而imshow执行之后,灰色窗口并没有随显示图像自动调整窗口的大小。

hide the hWnd

      查阅相关资料后,在这里找到了答案:opencv如何隐藏窗口

      原来namewindow在创建窗口时,新建了两个窗口,一个主窗口,一个子窗口,其中子窗口。原参考资料中仅隐藏了子窗口,主窗口未隐藏,且主窗口并不会随图像大小来调整自身的尺寸。经过验证,创建窗口时将子窗口与主窗口均隐藏,在获取到Mat格式的图片之后执行imshow之前,显示子窗口;这样处理之后,没有选择观察中间过程时,源图像上不会有多余的灰色框框出现。

      2. 图像拼接

      在plate_locate函数执行时,可能会返回多个备选车牌。在可视化界面中,我希望可以看到所有的备选车牌,因此这里用到了图像拼接。竖直拼接,水平拼接。

      3 目前处理方案的缺陷

      当前的处理方案相当于在一个窗口中分时显示不同的图像,会有下图所示的问题点:若前一个图像的尺寸大于当前显示图像的尺寸,会看到当前图像位于最上层,而前一个图像位于底层。我本来认为namewindow定义的窗口应该有可以清除当前图像的属性,很可惜我没有找到。我尝试过使用updatewindow和resizewindow来实现,但都未如愿。若有高手愿意指点一二,将不甚感激。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

Fork me on GitHub