在MFC的PictureControl控件中显示opencv Mat格式的图片
在车牌识别系统easyPR的MFC可视化界面中提到,在待识别车牌的左上角会有一个小窗口来显示车牌识别的中间过程,其中待识别车牌原图是在MFC的PicturControl中显示的,而中间过程是用opencv 处理后的Mat格式的图片,该图片显示在PictureControl的左上角。本文主要记录在picutreControl窗口指定位置显示Mat格式图片的方法以及当前此方案的遗留问题点。
本方案的源代码地址:https://github.com/livezingy/EasyPR_MFC
目前实现的MFC可视化界面中,中间过程包含plate locate, plate judge, plate detect, chars segment,其中plate detect会在源图像中将判定为车牌的部分用不同
1.在picutrecontrol指定位置显示Mat格式图片
该功能实现时的主要参考资料:在 MFC 框架中,有什么方法能直接将 OpenCV 2.0 库中 Mat 格式的图片传递到 Picture Control(图片控件)显示?
按照该参考资料的做法,会得到下图所示结果。在还未执行到imshow时,就有一个比较大的灰色窗口覆盖了原图的一部分,而imshow执行之后,灰色窗口并没有随显示图像自动调整窗口的大小。
查阅相关资料后,在这里找到了答案:opencv如何隐藏窗口
原来namewindow在创建窗口时,新建了两个窗口,一个主窗口,一个子窗口,其中子窗口。原参考资料中仅隐藏了子窗口,主窗口未隐藏,且主窗口并不会随图像大小来调整自身的尺寸。经过验证,创建窗口时将子窗口与主窗口均隐藏,在获取到Mat格式的图片之后执行imshow之前,显示子窗口;这样处理之后,没有选择观察中间过程时,源图像上不会有多余的灰色框框出现。
2. 图像拼接
在plate_locate函数执行时,可能会返回多个备选车牌。在可视化界面中,我希望可以看到所有的备选车牌,因此这里用到了图像拼接。竖直拼接,水平拼接。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
//垂直方向上Mat格式的图片拼接,水平方向上的图片拼接用hconcat int result = plate.plateLocate(src, resultVec); if (result == 0) { cv::Mat resultMat,comMat; size_t num = resultVec.size(); size_t j = 1; comMat = resultVec[0]; while (j < num) { resultMat = resultVec[j]; vconcat(comMat, resultMat, comMat); j++; } imshow("view", comMat); } |
3 目前处理方案的缺陷
当前的处理方案相当于在一个窗口中分时显示不同的图像,会有下图所示的问题点:若前一个图像的尺寸大于当前显示图像的尺寸,会看到当前图像位于最上层,而前一个图像位于底层。我本来认为namewindow定义的窗口应该有可以清除当前图像的属性,很可惜我没有找到。我尝试过使用updatewindow和resizewindow来实现,但都未如愿。若有高手愿意指点一二,将不甚感激。