OpenCV基础篇——视频显示
2014-08-10 16:34
260 查看
Opencv的视频显示,其实质是图片显示,只不过是连续显示不同的图片。其中如果涉及GUI,还要用多线程。现在讲自己所用的视频显示写出来供大家参考,主要涉及opencv在win32和mfc中显示视频。
一:Win32+OpenCV
二:MFC+OpenCV
对应mfc其实质的操作和win32一样,但是这有界面,要注意多线程否则会卡死无法操作。另外就是这需要显示在控件内。
只贴出关键代码,看后自然会明白。
.h文件
.cpp文件:
这样就差不多了,主要是在mfc的视频显示的多线程实现,这样的多线程实现以后还可以用在mfc中的其它地方,也是一样的好用,编译的时候可能还需要加部分头文件。希望能帮到需要它的朋友,如果有错还请指出,共同学习交流。
一:Win32+OpenCV
#include "highgui.h" int main() { const char *showwindow= "image";//窗口名字 CvCapture *capture = NULL; capture=cvCaptureFrom***I("E:\\1.avi");//加载视频 int framesum = (int) cvGetCaptureProperty( capture, CV_CAP_PROP_FRAME_COUNT );//获取帧的总数 int numfrm = 0; IplImage* frame =NULL; IplImage * newframe= NULL; cvNamedWindow(showwindow,0);//生成窗口 while(numfrm < framesum) { frame = cvQueryFrame(capture);//获取一帧 numfrm ++; if(numfrm==1)//以后可以反复利用新创建的内存,创建一次即可 { newframe=cvCreateImage(cvSize(frame->width,frame->height),IPL_DEPTH_8U,3);//创建与视频帧大小一样的一个frame } cvCopyImage(frame,newframe);//将视频帧复制到newframe中,以后就可以直接对newframe处理了 if(cvWaitKey(1)==27) break; cvShowImage(showwindow, newframe);//在窗口中显示视频帧 //cvReleaseImage(&newframe);//这里不需要释放 } cvDestroyWindow(showwindow); cvReleaseCapture(&capture); return 0; }
二:MFC+OpenCV
对应mfc其实质的操作和win32一样,但是这有界面,要注意多线程否则会卡死无法操作。另外就是这需要显示在控件内。
只贴出关键代码,看后自然会明白。
.h文件
public: CRect rect; CWnd *pwnd; CDC *pdc; HDC hdc; CWinThread * hTread2; void showpicture(IplImage* img); static UINT videorun(LPVOID IpParamater); afx_msg void OnBnClickedplay();
.cpp文件:
struct PARAMATER { CString path; CRect rect; HDC hdc; IplImage* image; }; void CtestDlg::OnBnClickedplay()//播放按键 { CString vpath = "E:\\1.avi"; PARAMATER *IpParamater2 = new PARAMATER; pwnd=GetDlgItem(IDC_STATIC); //获取显示视频图像的控件ID pdc =pwnd->GetDC(); hdc=pdc->GetSafeHdc(); //获取句柄 GetDlgItem(IDC_STATIC)->GetClientRect(rect); //获取控件的RECT IpParamater2->hdc = hdc; IpParamater2->path = vpath; IpParamater2->rect = rect; hTread2=AfxBeginThread(videorun,(LPVOID)IpParamater2,0,0,0,NULL); //这里使用mfc的多线程函数来实现 } UINT CtestDlg:: videorun(LPVOID IpParamater)//线程函数,主要是静态的 { CtestDlg *pDlg = (CtestDlg*)IpParamater; CString filename = ((PARAMATER*)IpParamater)->path; CvCapture *capture = NULL; capture=cvCaptureFrom***I(filename); int framesum = (int) cvGetCaptureProperty( capture, CV_CAP_PROP_FRAME_COUNT ); int numfrm = 0; IplImage* frame =NULL; while(numfrm < framesum-1) { frame = cvQueryFrame(capture); newframeout = cvCloneImage(frame); pDlg->showpicture(newframeout); numfrm ++; cvReleaseImage(&newframeout); } cvReleaseCapture(&capture); //cvReleaseImage(&newframeout); } return 0; } //用来显示每帧的函数,显示到指定的控件内 void Ctest::showpicture(IplImage* img)// ID 是Picture Control控件的ID号 { CDC* pDC=GetDlgItem(IDC_STATIC)->GetDC();// 获得显示控件的 DC HDC hDC=pDC->GetSafeHdc();// 获取 HDC(设备句柄) 来进行绘图操作 CvvImage cimg; cimg.CopyOf(img); // 复制图片 cimg.DrawToHDC(hDC,&m_rect); ReleaseDC(pDC); }
这样就差不多了,主要是在mfc的视频显示的多线程实现,这样的多线程实现以后还可以用在mfc中的其它地方,也是一样的好用,编译的时候可能还需要加部分头文件。希望能帮到需要它的朋友,如果有错还请指出,共同学习交流。
相关文章推荐
- 使用 Visual Studio 2008 和 OpenCV 在窗口显示图片或视频
- opencv读取视频文件并显示的程序详细解释
- 【存档】QT和OpenCV 显示视频
- OpenCV学习笔记之图像视频显示
- OpenCV学习 利用MFC的Picture控件显示图像+播放视频和捕获摄像头画面
- OpenCV学习笔记(5)在单个窗口中显示多个视频子窗口
- Zedboard摄像头获取视频设计问题篇(四)-OpenCV+QT配置显示图片
- 在MFC控件中显示opencv库中的图像或者视频用的CvvImage
- 利用MFC和opencv读取视频显示图像方法
- OpenCV 获取摄像头并显示摄像头视频
- opencv [c++版] 学习笔记(1) 显示图像及播放视频
- OpenCV学习笔记(5)在单个窗口中显示多个视频子窗口
- OPENCV如何把视频显示到MFC的picture控件上
- OpenCV入门系列(4):显示一张图片和一个视频
- 【笔记】ecshop二次开发视频教程基础篇(第七讲)商品列表显示
- 用opencv简单显示图像和视频(代码有注释)
- Opencv显示视频
- 在MFC控件中显示opencv库中的图像或者视频用的CvvImage
- opencv 视频读取 和 进度条显示
- OpenCV笔记4:在单个窗口中显示多个视频子窗口