使用OpenCV在MFC/C++应用程序中显示图像

dav*_*vid 3 c++ mfc opencv

我想在MFC应用程序中显示我从具有OpenCV(cvCaptureFromAVI函数)的avi文件中捕获的帧.

我是MFC的新手,但觉得我已经接近使它成功了.但是,不是在图片框中显示的帧,它们显示在新窗口中.

cvGetWindowName 返回始终为null值.

有我的代码:

CWnd* hPic = 0;
hPic = GetDlgItem(IDC_STATICPIC1);  
const char* szWindName = cvGetWindowName(hPic->GetSafeHwnd());
cvShowImage(szWindName, frame_copy);
Run Code Online (Sandbox Code Playgroud)

dav*_*vid 7

经过长时间的研究,我发现了一些可以使它发挥作用的东西

解决方案是创建窗口,然后将其插入图片框.我不确定这是好习惯,但我现在还没有找到更好的东西.

cvNamedWindow("IDC_STATIC_OUTPUT", 0); 
cvResizeWindow("IDC_STATIC_OUTPUT", 420, 240);

HWND hWnd = (HWND) cvGetWindowHandle("IDC_STATIC_OUTPUT"); 
HWND hParent = ::GetParent(hWnd); 
     ::SetParent(hWnd, GetDlgItem(IDC_PIC1)->m_hWnd); 
     ::ShowWindow(hParent, SW_HIDE); 

cvShowImage("IDC_STATIC_OUTPUT", frame_copy);
Run Code Online (Sandbox Code Playgroud)

在这种情况下,图片框称为IDC_PIC1,frame_copy是OpenCV IplImage.

希望这有助于某人.


小智 7

使用以下代码,您可以将Mat转换为CImage,然后在任何地方显示CImage:

int Mat2CImage(Mat *mat, CImage &img){
  if(!mat || mat->empty())
    return -1;
  int nBPP = mat->channels()*8;
  img.Create(mat->cols, mat->rows, nBPP);
  if(nBPP == 8)
  {
    static RGBQUAD pRGB[256];
    for (int i = 0; i < 256; i++)
        pRGB[i].rgbBlue = pRGB[i].rgbGreen = pRGB[i].rgbRed = i;
    img.SetColorTable(0, 256, pRGB);
  }
  uchar* psrc = mat->data;
  uchar* pdst = (uchar*) img.GetBits();
  int imgPitch = img.GetPitch();
  for(int y = 0; y < mat->rows; y++)
  {
    memcpy(pdst, psrc, mat->cols*mat->channels());//mat->step is incorrect for those images created by roi (sub-images!)
    psrc += mat->step;
    pdst += imgPitch;
  }

  return 0;
}
Run Code Online (Sandbox Code Playgroud)