既存コードをコンパイルしてみると、IplImage が定義されていないと怒られてしまう。どうやら、IplImage が deprecated になったようだ。
どこで IplImage を使っていたかと言うと、BITMAPハンドルとcv::Matの相互変換部分。
cv::Mat BitmapToMat(HANDLE hBitmap) { cv::Mat result; { BITMAP bm; GetObject(hBitmap, sizeof(BITMAP), &bm ); result = cv::Mat( bm.bmHeight, bm.bmWidth, CV_8UC4, cv::Scalar(255,255,255,255) ); IplImage img = result; memcpy( img.imageData, bm.bmBits, bm.bmWidthBytes * bm.bmHeight ); } return result; } HBITMAP MatToBitmap(const cv::Mat& src, HDC hMemDC) { HBITMAP hBitmap = NULL; if( !src.empty() && src.cols > 0 && src.rows > 0 ) { BITMAPINFO bi; bi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); bi.bmiHeader.biWidth = src.cols; bi.bmiHeader.biHeight = src.rows; bi.bmiHeader.biPlanes = 1; bi.bmiHeader.biBitCount = 32; bi.bmiHeader.biCompression = BI_RGB; { LPDWORD lpPixels; hBitmap = CreateDIBSection( hMemDC, &bi, DIB_RGB_COLORS, reinterpret_cast<void**>(&lpPixels), NULL, 0 ); GdiFlush(); } BITMAP bm; GetObject(hBitmap, sizeof(BITMAP), &bm); cv::Mat rev; cv::flip(src, rev, 0); IplImage img = rev; memcpy( bm.bmBits, img.imageData, src.cols * src.rows * 4 ); } return hBitmap; }どう手直ししたら良いのかわからなくて、ググってみたが情報が少ない。
これは需要があるかもしれん?と思って、ここに記すことにした
cv::Mat BitmapToMat(HANDLE hBitmap) { cv::Mat result; { BITMAP bm; GetObject(hBitmap, sizeof(BITMAP), &bm ); result = cv::Mat( bm.bmHeight, bm.bmWidth, CV_8UC4, (void*)bm.bmBits ); } return result; } HBITMAP MatToBitmap(const cv::Mat& src, HDC hMemDC) { HBITMAP hBitmap = NULL; if( !src.empty() && src.cols > 0 && src.rows > 0 ) { BITMAPINFO bi; bi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); bi.bmiHeader.biWidth = src.cols; bi.bmiHeader.biHeight = src.rows; bi.bmiHeader.biPlanes = 1; bi.bmiHeader.biBitCount = 32; bi.bmiHeader.biCompression = BI_RGB; { LPDWORD lpPixels; hBitmap = CreateDIBSection( hMemDC, &bi, DIB_RGB_COLORS, reinterpret_cast<void**>(&lpPixels), NULL, 0 ); GdiFlush(); } BITMAP bm; GetObject(hBitmap, sizeof(BITMAP), &bm); cv::Mat rev; cv::flip(src, rev, 0); memcpy( bm.bmBits, rev.ptr(), src.cols * src.rows * 4 ); } return hBitmap; }ポインタをダイレクトに扱っているので、適正に使用しないと Abnormal Termination を引き起こすでしょう。
0 件のコメント:
コメントを投稿