VS2012 Form + OpenCV

1 公共语言运行时支持(/clr)

    根据参考资料[1]的提示,如果想在Form中使用OpenCV,则不能使用/clr:pure或者/clr:safe模式,要使用/clr模式,如下图:

VS2012 Form + OpenCV_第1张图片

2 IplImage->Bitmap

    在Form中使用OpenCV的一个关键问题是使用OpenCV打开的图像如何显示。由于VS2012 Form中,pictureBox控件显示的图像是Bitmap类型的,因此一个思路是将IplImage转换为Bitmap,然后显示。参考资料[2]提供了相关转换的实现,但是使用过程中出现问题。下面是根据参考资料[2]做出的修改:

/*----------------------------
 * 功能 : 将 IplImage 转换为 Drawing::Bitmap‚,拷贝图像数据
 *----------------------------
 * 函数 : CopyIplImagetoBitmap
 * 访问 : private
 * 返回 : System::Drawing::Bitmap^
 * 参数 : cv::IplImage * src
 */
private: System::Drawing::Bitmap^ CopyIplImageToBitmap(/*cv::Mat*/IplImage *src) 
{
	// ƒbitmap 初始化
	System::Drawing::Bitmap ^dst;
	if (src->nChannels == 1) {
		dst = gcnew System::Drawing::Bitmap(
			src->widthStep, src->height, System::Drawing::Imaging::PixelFormat::Format24bppRgb);
	}
	else {
		dst = gcnew System::Drawing::Bitmap(
		src->width, src->height, System::Drawing::Imaging::PixelFormat::Format24bppRgb);
	}

	// ’获取 bitmap 数据指针
	System::Drawing::Imaging::BitmapData ^data = dst->LockBits(
		*(gcnew System::Drawing::Rectangle(0, 0, dst->Width, dst->Height)), 
		System::Drawing::Imaging::ImageLockMode::ReadWrite, 
		System::Drawing::Imaging::PixelFormat::Format24bppRgb
		);

	// ƒ复制图像数据
	// 3通道,整体复制
	if (src->nChannels == 3) {
		memcpy(data->Scan0.ToPointer(), src->imageData, src->imageSize);
	}

	// 单通道,逐个像素复制
	else {
		char *p = (char *)data->Scan0.ToPointer(); 
		for (int i = 0, j = 0; j < src->widthStep * src->height; i += 3, j++) {  
			*(p + i) = *(p + i + 1) = *(p + i + 2) = *(src->imageData + j);  	
		}  
	}

	// 释放 cv::IplImage 数据,因为要进行图像处理,在这里暂时不释放,等处理完了再在其它地方释放
	// cvReleaseImage(&src);

	// ’解除 bitmap 数据保护
	dst->UnlockBits(data);

	return dst;
}


参考资料

[1]Form里使用Opencv

[2]OpenCV学习笔记(24)CLR模式下System::Drawing::Bitmap与cv::Mat图像格式的转换

[3]c++Windows窗体应用程序中怎么使用opencv

你可能感兴趣的:(VS2012 Form + OpenCV)