OpenCV学习记录(一)------在OpenCV在MFC控件上显示图片和视频

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Alexwu555/article/details/84333817

2018年11月22日记

因为OpenCV2.2以后,CvvImage.h和CvvImage.cpp已经不用了,所以要自己添加到解决方案里,我上传到CSDN了。

看了网上很多例子,试了一下。代码什么的就不粘了,说说遇到的问题。

(1)cvLoadImage函数,不管图片路径换成相对路径还是绝对路径,通过image watch查看,IplImage*的变量还是空的。

后来想着,要不用imread()读图放到mat变量,而后在转换成IplImage*变量。

主要因为,MFC上的picture控件是通过CvvImage类型的变量放上去的,而这个类型处理的图片类型是IPLImage*的。

(2)mat  --->  IplImage* 转换,图片变量还是空的,但mat变量确实读进图了。

有人给我建议,主要部分改成如下:

扫描二维码关注公众号,回复: 6185718 查看本文章

主要不同在于红波浪。这个代码最后没成功,不过,可再试。

后来,试了一个代码,成功了。

void CMFCApplication1Dlg::OnBnClickedButton1()
{
	// TODO: 在此添加控件通知处理程序代码

	CWnd *hwnd = GetDlgItem(IDC_STATIC);
	Mat src = imread("1.jpg");
	showMatImgToWnd(hwnd,src);


}
void CMFCApplication1Dlg::showMatImgToWnd(CWnd* pictureWnd, const Mat& disimg)
{
	if (disimg.empty())	return ;
	static BITMAPINFO *bitMapinfo = NULL;
	static bool First = TRUE;
	if (First)
	{
		BYTE *bitBuffer = new BYTE[40 + 4 * 256];//开辟一个内存区域
		if (bitBuffer == NULL)
		{
			return;
		}
		First = FALSE;
		memset(bitBuffer, 0, 40 + 4 * 256);
		bitMapinfo = (BITMAPINFO *)bitBuffer;
		bitMapinfo->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
		bitMapinfo->bmiHeader.biPlanes = 1;
		for (int i = 0; i<256; i++)
		{ //颜色的取值范围 (0-255)
			bitMapinfo->bmiColors[i].rgbBlue = bitMapinfo->bmiColors[i].rgbGreen = bitMapinfo->bmiColors[i].rgbRed = (BYTE)i;
		}
	}
	bitMapinfo->bmiHeader.biHeight = -disimg.rows;
	bitMapinfo->bmiHeader.biWidth = disimg.cols;
	bitMapinfo->bmiHeader.biBitCount = disimg.channels() * 8;
 
	CRect drect;
	pictureWnd->GetClientRect(drect);    //pWnd指向CWnd类的一个指针 
	CClientDC dc(pictureWnd);
	HDC hDC = dc.GetSafeHdc();                  //HDC是Windows的一种数据类型,是设备描述句柄;
	SetStretchBltMode(hDC, COLORONCOLOR);
	StretchDIBits(hDC,
		0,
		0,
		drect.right,  //显示窗口宽度
		drect.bottom,  //显示窗口高度
		0,
		0,
		disimg.cols,     //图像宽度
		disimg.rows,     //图像高度
		disimg.data,
		bitMapinfo,
		DIB_RGB_COLORS,
		SRCCOPY);

}

(3)读取视频并捕获图像,笔记本内置摄像头确实能捕获一帧图像并imshow,但是,就是不能在MFC控件上显示,又回归至第二个问题。

反正,frame就是空的,至今还没解决。

注意:VideoCapture和CvCapture*的使用区别。前者实际调用后者。

cvLoadImage()和imshow()的返回类型不一样。前者IplImage* ,后者mat。

前者在highgui_c.h是c,后者在highgui.h是C++。

(4)在成功显示图片后,尝试添加按钮,增加canny边缘检测和hough圆检测(这两个都是之前单独测试好的),但是后者运行中断,houghCircles()出错,待解决。

bug:

Unhandled exception at at 0x760FC54F in MFCApplication1.exe: Microsoft C++ exception: cv::Exception at memory location 0x0032E388.

(5)读取摄像头并捕获图像到指定文件夹。

试了很多种显示图片的方法,但是都不好用,只能全用(2)所贴的代码。

注:但是,获取的图像左右反了!

猜你喜欢

转载自blog.csdn.net/Alexwu555/article/details/84333817