HCRM博客

CVVImage报错原因解析

错误原因

类被取消:高版本的OpenCV(如2.4.7及以上)中,CvvImage类已被取消,如果项目依赖此旧类且未做相应更改,就会导致编译错误。

解决方法

添加自定义实现:由于官方不再提供CvvImage类,开发者需要自行实现相关功能,可以参考网上的开源实现或根据项目需求自己编写代码来替代CvvImage类的功能,可以使用OpenCV提供的其他函数和类来实现图像的加载、显示、处理等功能。

CVVImage报错原因解析-图1
(图片来源网络,侵权删除)

修改代码逻辑:如果项目中只是部分使用了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的控件上,也可以使用其他第三方库或自定义绘制函数来实现类似的功能。

CVVImage报错原因解析-图2
(图片来源网络,侵权删除)

本站部分图片及内容来源网络,版权归原作者所有,转载目的为传递知识,不代表本站立场。若侵权或违规联系Email:zjx77377423@163.com 核实后第一时间删除。 转载请注明出处:https://blog.huochengrm.cn/gz/24444.html

分享:
扫描分享到社交APP
上一篇
下一篇