mfc显示mat图片的两种方式
方式一:将opencv的窗口嵌入到mfc的窗口内
将opencv窗口与mfc窗口绑定之后就可以通过cv::imshow("video",img)显示mat格式的img了
cv::namedWindow("video", CV_WINDOW_NORMAL);
HWND m_wincv = (HWND)cvGetWindowHandle("video");
HWND hParent1 = ::GetParent(m_wincv);
HWND hw = ::SetParent(m_wincv, GetDlgItem(IDC_VIDEO)->m_hWnd);
::ShowWindow(hParent1, SW_HIDE);
CRect rect;
GetDlgItem(IDC_VIDEO)->GetClientRect(rect);
cv::resizeWindow("video", rect.Width(), rect.Height());
方法二:将opencv中mat格式的图片数据转为CImage的类
CImage这个类可以实现mfc界面的贴图功能
void MatToCImage(cv::Mat& mat, CImage& cImage)
{
int width = mat.cols;
int height = mat.rows;
int channels = mat.channels();
cImage.Destroy();
cImage.Create(width, height, 8 * channels);
uchar* ps;
uchar* pimg = (uchar*)cImage.GetBits();
int step = cImage.GetPitch();
for (int i = 0; i < height; ++i)
{
ps = (mat.ptr<uchar>(i));
for (int j = 0; j < width; ++j)
{
if (channels == 1)
{
*(pimg + i * step + j) = ps[j];
}
else if (channels == 3)
{
for (int k = 0; k < 3; ++k)
{
*(pimg + i * step + j * 3 + k) = ps[j * 3 + k];
}
}
}
}
}
RECT m_rect;
CImage cimage;
GetDlgItem(IDC_VIDEO)->GetClientRect(&m_rect);
CDC* pdc =GetDlgItem(IDC_VIDEO)->GetDC();
int win_w = m_rect.right - m_rect.left;
int win_h = m_rect.bottom - m_rect.top;
MatToCImage(matImg, cimage);
SetStretchBltMode(pdc->m_hDC, STRETCH_HALFTONE);
cimage.Draw(pdc->m_hDC, 0, 0, win_w, win_h,0,0, matImg.cols, matImg.rows);
ReleaseDC(pdc);
补充:
void DrawRect(CDC* pDC, int x1, int y1, int x2, int y2, int color)
{
int i = 0;
switch (color)
{
case 0:
{
CPen NewPen(PS_SOLID, 1, RGB(255, 0, 0));
pDC->SelectObject(&NewPen);
pDC->SelectObject(GetStockObject(NULL_BRUSH));
pDC->Rectangle(x1, y1, x2, y2);
break;
}
case 1:
{
CPen NewPen(PS_SOLID, 1, RGB(0, 255, 0));
pDC->SelectObject(&NewPen);
pDC->SelectObject(GetStockObject(NULL_BRUSH));
pDC->Rectangle(x1, y1, x2, y2);
break;
}
case 2:
{
CPen NewPen(PS_SOLID, 1, RGB(0, 0, 255));
pDC->SelectObject(&NewPen);
pDC->SelectObject(GetStockObject(NULL_BRUSH));
pDC->Rectangle(x1, y1, x2, y2);
break;
}
case 3:
{
CPen NewPen(PS_SOLID, 1, RGB(255, 255, 0));
pDC->SelectObject(&NewPen);
pDC->SelectObject(GetStockObject(NULL_BRUSH));
pDC->Rectangle(x1, y1, x2, y2);
break;
}
case 4:
{
CPen NewPen(PS_SOLID, 1, RGB(255, 0, 255));
pDC->SelectObject(&NewPen);
pDC->SelectObject(GetStockObject(NULL_BRUSH));
pDC->Rectangle(x1, y1, x2, y2);
break;
}
case 5:
{
CPen NewPen(PS_SOLID, 1, RGB(0, 255, 255));
pDC->SelectObject(&NewPen);
pDC->SelectObject(GetStockObject(NULL_BRUSH));
pDC->Rectangle(x1, y1, x2, y2);
break;
}
case 6:
{
CPen NewPen(PS_SOLID, 1, RGB(255, 255, 255));
pDC->SelectObject(&NewPen);
pDC->SelectObject(GetStockObject(NULL_BRUSH));
pDC->Rectangle(x1, y1, x2, y2);
break;
}
}
}
参考:
MFC OpenCV:显示图片的3种方法(详细)