我想在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)
经过长时间的研究,我发现了一些可以使它发挥作用的东西
解决方案是创建窗口,然后将其插入图片框.我不确定这是好习惯,但我现在还没有找到更好的东西.
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)
归档时间: |
|
查看次数: |
9144 次 |
最近记录: |