错误原因
类被取消:高版本的OpenCV(如2.4.7及以上)中,CvvImage类已被取消,如果项目依赖此旧类且未做相应更改,就会导致编译错误。
解决方法
添加自定义实现:由于官方不再提供CvvImage类,开发者需要自行实现相关功能,可以参考网上的开源实现或根据项目需求自己编写代码来替代CvvImage类的功能,可以使用OpenCV提供的其他函数和类来实现图像的加载、显示、处理等功能。

修改代码逻辑:如果项目中只是部分使用了CvvImage类的功能,可以考虑修改代码逻辑,使用OpenCV的其他函数和类来实现相同的功能,避免直接使用已被取消的CvvImage类。
示例代码
以下是一个在MFC中使用OpenCV显示图片到Picture Control控件的示例代码,不使用CvvImage类:
- #include <opencv2/opencv.hpp>
- #include <afxwin.h>
- #define WIDTHBYTES(bits) (((bits)+31)/32*4)
- class CMFCDrawDlg : public CDialogEx
- {
- public:
- CMFCDrawDlg(CWnd* pParent = NULL);
- protected:
- virtual void DoDataExchange(CDataExchange* pDX);
- afx_msg void OnPaint();
- DECLARE_MESSAGE_MAP()
- public:
- CStatic m_pic;
- };
- CMFCDrawDlg::CMFCDrawDlg(CWnd* pParent /*=NULL*/)
- : CDialogEx(IDD_MYDIALOG, pParent)
- {
- }
- BEGIN_MESSAGE_MAP(CMFCDrawDlg, CDialogEx)
- ON_WM_PAINT()
- END_MESSAGE_MAP()
- void CMFCDrawDlg::DoDataExchange(CDataExchange* pDX)
- {
- CDialogEx::DoDataExchange(pDX);
- DDX_Control(pDX, IDC_STATIC_SHOW, m_pic);
- }
- void CMFCDrawDlg::OnPaint()
- {
- CPaintDC dc(this);
- CRect rect;
- m_pic.GetClientRect(&rect);
- int width = rect.Width();
- int height = rect.Height();
- IplImage* img = cvLoadImage("path_to_image.jpg");
- if (img)
- {
- drawpic(img, IDC_STATIC_SHOW);
- cvReleaseImage(&img);
- }
- }
- void CMFCDrawDlg::drawpic(IplImage* img, unsigned int id)
- {
- BITMAPINFO *pbmi;
- BYTE *bmibuf;
- BYTE *g_pBits;
- HDC g_hMemDC;
- HBITMAP g_hBmp;
- bmibuf = new BYTE[sizeof(BITMAPINFO) + 256 * sizeof(RGBQUAD)];
- memset(bmibuf, 0, sizeof(bmibuf));
- pbmi = (BITMAPINFO*)bmibuf;
- pbmi>bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
- pbmi>bmiHeader.biWidth = img>width;
- pbmi>bmiHeader.biHeight = img>height;
- pbmi>bmiHeader.biPlanes = 1;
- pbmi>bmiHeader.biBitCount = 24;
- pbmi>bmiHeader.biCompression = BI_RGB;
- CStatic *pic = (CStatic*)GetDlgItem(id);
- pic>GetClientRect(&rect);
- g_hMemDC = CreateCompatibleDC(NULL);
- g_hBmp = CreateDIBSection(g_hMemDC, pbmi, DIB_RGB_COLORS, (void**)&g_pBits, 0, 0);
- int l_width = WIDTHBYTES(img>width * pbmi>bmiHeader.biBitCount);
- for (int row = 0; row < img>height; row++)
- {
- memcpy(&g_pBits[row * l_width], &img>imageData[(img>height row 1) * l_width], l_width);
- }
- SelectObject(g_hMemDC, g_hBmp);
- HDC hDC = GetDC(this);
- pic>SetBitmap(g_hBmp);
- ReleaseDC(this, hDC);
- delete[] bmibuf;
- }
FAQs
Q:为什么高版本的OpenCV要取消CvvImage类?
A:可能是因为该类的功能可以通过OpenCV的其他更通用、更灵活的函数和类来实现,取消该类可以减少代码冗余和维护成本。
Q:如果不使用CvvImage类,还有其他方式可以在MFC中使用OpenCV显示图片吗?
A:是的,可以使用上述示例代码中的方法,通过创建位图和设备环境,将OpenCV加载的图像数据显示在MFC的控件上,也可以使用其他第三方库或自定义绘制函数来实现类似的功能。
