【发布时间】:2019-10-02 01:30:21
【问题描述】:
我想将 ATL::CImage 转换为 cv::Mat 以在 opencv(C++) 中进行图像处理。
你能帮忙转换一下这个对象吗?
我从 Windows 屏幕截图(使用 MFC)中获得了 CImage。
然后,我想处理 OpenCV Mat 对象中的图像。
我不知道如何转换。
- C++ 项目(VC 2017)
- MFC
- OpenCV 3.4.6
CImage image;
int cx;
int cy;
CWnd* pWndDesktop = CWnd::GetDesktopWindow();
CWindowDC srcDC(pWndDesktop);
Rect rcDesktopWindow;
::GetWindowRect(pWndDesktop->m_hWnd, %rcDesktopWindow);
cx = (rcDesktopWindow.right - rcDesktopWindow.left);
cy = (rcDesktopWindow.bottom - rcDesktopWindow.top);
image.create(cx, cy, srcDC.GetDeviceCaps(BITPIXEL));
CDC* pDC = CDC::FromHandle(image.GetDC());
pDC->BitBlt(0, 0, cx, cy, &srcDC, 0, 0, SRCCOPY);
image.ReleaseDC();
cv::Mat mat;
// I want set image to mat!
mat = image???
无法将ATL::Image 转换为cv::Mat。
【问题讨论】:
-
你可以去掉中间人,只用一个函数来获取屏幕截图作为一个 Mat。这可能会有所帮助:stackoverflow.com/questions/34466993/opencv-desktop-capture 或 stackoverflow.com/questions/14148758/…
-
最简单(但相当愚蠢)的方法是将其保存到文件中(似乎有一个成员函数可以做到这一点),然后使用
imread将其加载回来。您似乎也可以保存到内存流中,因此您可以将生成的缓冲区提供给imdecode并避免使用文件系统。最好的方法是获得一个具有已知布局的像素缓冲区,Mat可以理解(行主要,理想情况下从上到下,所以你不需要翻转它).. 然后你只需要创建一个Mat标题以匹配数据。只需要从Mat转到 GDI 对象,所以需要研究。