错误原因
类被取消:高版本的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的控件上,也可以使用其他第三方库或自定义绘制函数来实现类似的功能。

