とある集団のプログラムメモ

OpenCVのIplImageをWin32APIで使えるようにBMP(DIB)へ変換して表示する.
ソースファイル

IplImageからDIBへ変換する関数を作る.
引数説明
const IplImage* srcIplImage変換元のIplImage
BITMAPINFO& bmpInfoBITMAPINFO構造体
unsigned long* bmpData実際の画像データ
//IplImage からBMP(DIB)へ変換する.
void iplTobmp(const IplImage* srcIplImage, BITMAPINFO& bmpInfo, unsigned long* bmpData)
{
	int width  = srcIplImage->width;
	int height = srcIplImage->height;

	ZeroMemory(&bmpInfo, sizeof(bmpInfo));
	bmpInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
	bmpInfo.bmiHeader.biWidth = width;
	bmpInfo.bmiHeader.biHeight = height;
	bmpInfo.bmiHeader.biPlanes = 1;
	bmpInfo.bmiHeader.biBitCount = 32;
	bmpInfo.bmiHeader.biCompression = BI_RGB;
	
	unsigned long pixel;
	unsigned char r, g, b;
	for(int i = 0; i < height; i++){
		for(int j = 0; j < width; j++){
			b = srcIplImage->imageData[srcIplImage->widthStep * i + j * 3];
			g = srcIplImage->imageData[srcIplImage->widthStep * i + j * 3 + 1];
			r = srcIplImage->imageData[srcIplImage->widthStep * i + j * 3 + 2];
			pixel = 0x00000000;
			pixel =  (r << 16) + (g << 8) + b;
			bmpData[j + (height-i-1) * width ] = pixel;
		}
	}
}



変数を用意する.
IplImage* imgFromOpenCV;
BITMAPINFO bmpInfo;
unsigned long* bmpData;		

どこかでIplImageをロードして,DIBへ変換する.
	//OpenCVでロード
	imgFromOpenCV = cvLoadImage("testimg.jpg", CV_LOAD_IMAGE_COLOR);
	//メモリを確保
	bmpData = (LPDWORD)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, imgFromOpenCV->width * imgFromOpenCV->height * 4);
	//iplImageからDIBへ変換
	iplTobmp(imgFromOpenCV, bmpInfo, bmpData);

WM_PAINTメッセージが送られてきたらStretchDIBitsで表示する.
	case WM_PAINT:
		//画像を表示
		StretchDIBits( hDC, 
				0, 0, imgFromOpenCV->width, imgFromOpenCV->height, 
				0, 0, imgFromOpenCV->width, imgFromOpenCV->height, 
				bmpData, &bmpInfo, DIB_RGB_COLORS, SRCCOPY);
		break;

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

×

この広告は60日間更新がないwikiに表示されております。

メンバーのみ編集できます