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变量确实读进图了。
有人给我建议,主要部分改成如下:
主要不同在于红波浪。这个代码最后没成功,不过,可再试。
后来,试了一个代码,成功了。
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)所贴的代码。
注:但是,获取的图像左右反了!