【发布时间】:2011-10-23 09:52:21
【问题描述】:
我似乎无法弄清楚如何做到这一点,我在 google 上搜索并找到了两个代码示例,一个来自 github 屏幕截图库,另一个来自发布组,它们似乎都没有工作。
我有一个结构:
struct ClacksScreen
{
HWND hDesktopWnd;
int width, height;
RECT wr, cr;
HDC hdcClacksScreen; // hardware ClacksScreen
HDC hdcMemDC; // ClacksScreen in memory
HBITMAP hbmClacksScreen; //hbitmap of the ClacksScreen
BITMAP bmpClacksScreen;
BITMAPINFOHEADER bi;
};
已更新。我定义了一些函数,包括将位图写入磁盘的函数,它工作正常,屏幕被捕获并将 bmp 写入磁盘,这是我想要的。
现在我想将屏幕上的 HBITMAP 直接转换为 OpenCV2.1 的 cv::Mat。
它有点工作,除了图像是纯灰色的并且它崩溃了。显然,我在 c++ 方面仍然很n00b,所以可能有一些简单的东西我只是没有摸索。
static cv::Mat copyToCVMat(const ClacksScreen * s)
{
cv::Mat image;
image.create(s->bmpClacksScreen.bmWidth, s->bmpClacksScreen.bmHeight, CV_8UC4);
GetDIBits(s->hdcMemDC, s->hbmClacksScreen, 0,
(UINT)s->bmpClacksScreen.bmHeight,
image.data,
(BITMAPINFO *)&s->bi, DIB_RGB_COLORS);
return image;
}
当我包装一个 cv::imwrite(image);在尝试捕获中,我得到了一个错误的分配错误。显然,在这一点上,我们已经确定我不知道如何做到这一点,因此我们将不胜感激。
更新
如果我运行这段代码:
try {
cv::Mat screen = cv::imread("captureqwsx.jpg");
if (!screen.data) {
printf("no image data?");
}
cv::imwrite("out.jpg",screen);
} catch(std::exception e) {
printf("Exception %s\n",e.what());
}
我得到了输出:
没有图像数据?异常错误分配
当我尝试运行高 gui 时,它和以前一样,写入磁盘的 .jpg 和 .bmps 都会出现问题,它们可以在图像查看器和 MS Paint 中查看。
我尝试使用完全不同的图片,来自网站的 .png,同样的问题。
那么我现在做错了什么?
【问题讨论】:
标签: c++ visual-studio winapi opencv