来自链接:http://www.zhihu.com/question/29611790/answer/45068617
是实测两种都可以,
本人更喜欢第二种。
void Ckinect2Dlg::drawcvmat(Mat m_cvImg, UINT ID)
{
Mat img;
CRect rect;
GetDlgItem(ID)->GetClientRect(&rect);
Rect dst(rect.left,rect.top,rect.right,rect.bottom);
resize(m_cvImg,img,Size(rect.Width(),rect.Height()));
unsigned int m_buffer[sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD)*256];
BITMAPINFO* m_bmi = (BITMAPINFO*) m_buffer;
BITMAPINFOHEADER* m_bmih = &(m_bmi->bmiHeader);
memset(m_bmih, 0, sizeof(*m_bmih));
m_bmih->biSize = sizeof(BITMAPINFOHEADER);
m_bmih->biWidth = img.cols;
m_bmih->biHeight = -img.rows; // 在自下而上的位图中 高度为负
m_bmih->biPlanes = 1;
m_bmih->biCompression = BI_RGB;
m_bmih->biBitCount =8* img.channels();
CDC *pDC = GetDlgItem(ID)->GetDC();
::StretchDIBits(
pDC->GetSafeHdc(),
0, 0, rect.Width(), rect.Height(),
0, 0, img.cols, img.rows,
img.data,
(BITMAPINFO*) m_bmi,
DIB_RGB_COLORS,
SRCCOPY
);
ReleaseDC(pDC);
}
void Ckinect2Dlg::drawcvmat(Mat m_cvImg, UINT ID)
{
Mat img;
CRect rect;
GetDlgItem(ID)->GetClientRect(&rect);
Rect dst(rect.left,rect.top,rect.right,rect.bottom);
resize(m_cvImg,img,Size(rect.Width(),rect.Height()));
unsigned int m_buffer[sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD)*256];
BITMAPINFO* m_bmi = (BITMAPINFO*) m_buffer;
BITMAPINFOHEADER* m_bmih = &(m_bmi->bmiHeader);
memset(m_bmih, 0, sizeof(*m_bmih));
m_bmih->biSize = sizeof(BITMAPINFOHEADER);
m_bmih->biWidth = img.cols;
m_bmih->biHeight = -img.rows; // 在自下而上的位图中 高度为负
m_bmih->biPlanes = 1;
m_bmih->biCompression = BI_RGB;
m_bmih->biBitCount =8* img.channels();
CDC *pDC = GetDlgItem(ID)->GetDC();
::StretchDIBits(
pDC->GetSafeHdc(),
0, 0, rect.Width(), rect.Height(),
0, 0, img.cols, img.rows,
img.data,
(BITMAPINFO*) m_bmi,
DIB_RGB_COLORS,
SRCCOPY
);
ReleaseDC(pDC);
}
另外一个方法,也可以把OpenCV的窗口添加到PictureControl里面,这样你可以继续使用OpenCV的setMouseCallback直接对PictureControl进行鼠标操作。
首先在你的OnInit函数中添加如下
上面就是打开一个名为view的OpenCV窗口,并将其放置到一个ID为IDC_STATIC_CV的PictureControl里面,这个控件的类型需要是rectangle。当你在需要显示某图片的时候,就像在OpenCV里面显示一样就可以了。
首先在你的OnInit函数中添加如下
namedWindow("view", WINDOW_AUTOSIZE);
HWND hWnd = (HWND) cvGetWindowHandle("view");
HWND hParent = ::GetParent(hWnd);
::SetParent(hWnd, GetDlgItem(IDC_STATIC_CV)->m_hWnd);
::ShowWindow(hParent, SW_HIDE);
imshow("view", mat);