我似乎無法弄清楚如何做到這一點,我搜索了谷歌並找到了兩個代碼示例,一個來自github屏幕捕獲庫,另一個來自發布組,他們似乎在工作。將HBITMAP轉換爲cv :: Mat
我有一個結構:
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++的時候,我仍然非常努力,所以可能有一些簡單的東西,我只是不想做。
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 catch中,我得到一個錯誤的分配錯誤。很明顯,在這一點上,我們已經確定我沒有任何線索如何做到這一點,所以任何幫助,將不勝感激。
UPDATE
如果我運行此代碼:
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,同樣的問題。
那麼我現在做錯了什麼呢?
對不起,當它不工作我都試過了。看到上面的更新,我現在正在使用GetDIBits版本。 此外,在文檔中還有一個構造函數,它接受的數據爲: //構造函數指向用戶分配的數據的矩陣標頭 Mat(Size _size,int _type,void * _data,size_t _step = AUTO_STEP); –