HCRM博客

CVVImage报错原因解析

错误原因

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

CVVImage报错原因解析-图1

解决方法

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

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

修改代码逻辑:如果项目中只是部分使用了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报错原因解析-图3
(图片来源网络,侵权删除)

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

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