在 MFC/C++ 中显示图像使用 OpenCV 的应用程序
我想在 MFC 应用程序中显示我使用 OpenCV(cvCaptureFromAVI
函数)从 avi 文件捕获的帧。
我是 MFC 的新手,但感觉我已经接近让它工作了。但框架不是显示在图片框中,而是显示在新窗口中。
cvGetWindowName
始终返回空值。
有我的代码:
CWnd* hPic = 0;
hPic = GetDlgItem(IDC_STATICPIC1);
const char* szWindName = cvGetWindowName(hPic->GetSafeHwnd());
cvShowImage(szWindName, frame_copy);
I would like to display in a MFC application, frames that I capture from an avi file with OpenCV (cvCaptureFromAVI
function).
I'm new to MFC but feel like I'm close to making it work. But instead of the frames being displayed in the picture box they are displayed in a new window.
cvGetWindowName
returns always a null value.
There is my code:
CWnd* hPic = 0;
hPic = GetDlgItem(IDC_STATICPIC1);
const char* szWindName = cvGetWindowName(hPic->GetSafeHwnd());
cvShowImage(szWindName, frame_copy);
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
因此,经过长期研究,我找到了一些可以让它发挥作用的东西。
解决方案是创建窗口,然后将其插入图片框内。我不确定这是否是好的做法,但目前我还没有找到更好的做法。
在本例中,图片框称为 IDC_PIC1,frame_copy 是 OpenCV IplImage。
希望这对某人有帮助。
So I found something to make it work after long researches.
The solution is to create the window and then insert it inside the picture box. I'm not sure it's good practice but I haven't found anything better for now.
In this case the picture box is called IDC_PIC1 and frame_copy is a OpenCV IplImage.
Hope this helps somebody.
使用以下代码,您可以将 Mat 转换为 CImage,然后在您想要的任何地方显示 CImage:
Using the following code you can convert Mat to CImage and then display CImage everywhere you want:
注意:如果将 StretchDIBits() 方法与 BITMAPINFO 方法一起使用,则必须注意 StretchDIBits() 期望原始 OpenCV Mat::data 指针的行长度为 4 字节的偶数倍!如果没有,当您尝试通过 StretchDIBits() 将数据复制到 DC 时,您会遇到奇怪的剪切 - 图像不仅沿某个角度剪切,而且颜色也全部被丢弃。
这是我的代码的完整工作版本,它还支持在目标控件的矩形中维护图像长宽比。它可能可以做得更快一点,但目前可以使用:
NOTE: If you use the StretchDIBits() method with the BITMAPINFO approach, you MUST be aware that StretchDIBits() expects the raw OpenCV Mat::data pointer to have row lengths in even multiples of 4 bytes! If not, you'll get freaky shearing when you try to copy the data to the DC via StretchDIBits() - where the image is not only sheered along an angle, but the colors are all be trashed as well.
Here is my completely working edition of the code, which also supports maintaining image aspect ratio in the target control's rectangle. It can probably be made a bit faster, but it works for now:
int DrawImageToHDC(IplImage* img, HDC hdc, int xDest, int yDest, UINT iUsage, DWORD rop)
用法:DrawImageToHDC(img, pDC->m_hDC, Area.left, Area.top, DIB_RGB_COLORS, SRCCOPY);
int DrawImageToHDC(IplImage* img, HDC hdc, int xDest, int yDest, UINT iUsage, DWORD rop)
Usage: DrawImageToHDC(img, pDC->m_hDC, Area.left, Area.top, DIB_RGB_COLORS, SRCCOPY);