我想把ATL::CImage
转换成cv::Mat
,以便在opencv(C++)中进行图像处理。您能帮助转换这个对象吗?
我从windows屏幕截图中得到了CImage
(使用MFC)。然后,我想在OpenCV Mat对象中处理图像。
我不知道如何改变信仰。
- C++项目(VC 2017)
- 多功能控制器
- 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
。
3条答案
按热度按时间v64noz0r1#
如果高度为正值,则
CImage
创建自下而上位图。必须传递负高度才能为mat
创建自上而下位图使用
CImage::GetBits
检索位,如下所示:或强制执行深层复制,如下所示:
请注意,
CImage
为像素数据进行了自己的分配,而Mat
需要进行自己的分配,或者不得不从CImage
中借用,这可能很棘手。如果你只是截图,你可以使用普通的Windows API,然后直接写入
cv::Mat
。这样就有了一个单一的分配(快一点),并且mat
不依赖于其他对象。例如:编辑:
将
mat.data = (unsigned char*)image.GetBits();
更改为memcpy(mat.data, image.GetBits(), cy * cx * 4);
将
ReleaseDC(0, hdc)
更改为::ReleaseDC(0, hdc)
,以避免与CWnd::ReleaseDC(dc)
冲突ogq8wdun2#
用法:
ycl3bljg3#
通常,这种情况发生在MFC窗口应用程序开发中的图像处理。我正在开发一个基于MFC的应用程序,它使用EDSDK(佳能SDK)从佳能数码单反相机捕获图像。我使用了这个解决方案(节省时间),我面临的问题是图像分辨率下降!
解决方案在这里!100%工作。https://github.com/wlrl/convertType