DirecTwiX 4 Жалоба Опубликовано September 18, 2011 Нашёл я функцию перевода HBitmap в IplImage. Решил переписать для cvMat. При запуске вылетает умирает процесс, чей DC я использовал void hBitmap2Mat(HBITMAP hBmp, cv::Mat &img) { BITMAP bmp; GetObject(hBmp,sizeof(BITMAP),&bmp); int nChannels = bmp.bmBitsPixel == 1 ? 1 : bmp.bmBitsPixel/8; int depth = bmp.bmBitsPixel == 1 ? IPL_DEPTH_1U : IPL_DEPTH_8U; cv::Mat imgT(bmp.bmHeight, bmp.bmWidth, CV_MAKETYPE(depth, nChannels)); memcpy(imgT.data,(char*)(bmp.bmBits),bmp.bmHeight*bmp.bmWidth*nChannels); img=imgT; } ... RECT rect; GetClientRect(hWnd, &rect); int cx, cy; cx=rect.right-rect.left; cy=rect.bottom-rect.top; HBITMAP hBmp = CreateCompatibleBitmap(hDC, cx, cy); SelectObject(myDC, hBmp); BitBlt(myDC, 0, 0, cx, cy, hDC, rect.left, rect.top, SRCCOPY); cv::Mat img; hBitmap2Mat(hBmp, img); cv::imshow("1", img); cv::waitKey(0); Вот. Спустя день... Я написал эту штуку) Думаю, пригодится кому-нибудь: void Bmp2Mat(HDC hDC, HBITMAP hBmp, Mat &img) { BYTE *bmpData = new BYTE[3*img.cols*img.rows]; BITMAPINFOHEADER bmi={0}; bmi.biSize = sizeof(BITMAPINFOHEADER); bmi.biPlanes = 1; bmi.biBitCount = 24; bmi.biWidth = img.cols; bmi.biHeight = -img.rows; bmi.biCompression = BI_RGB; GetDIBits(hDC, hBmp, 0, img.rows, bmpData, (BITMAPINFO*)&bmi, DIB_RGB_COLORS); memcpy(img.data, bmpData, 3*img.cols*img.rows); delete [] bmpData; } 2 Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
al072 1 Жалоба Опубликовано August 27, 2016 Добрый день! Спасибо за пример кода. Подскажите пожалуйста какой HDC нужно передавать в функцию и как его создать? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах