OpenCV基础篇——视频显示

Opencv的视频显示,其实质是图片显示,只不过是连续显示不同的图片。其中如果涉及GUI,还要用多线程。现在讲自己所用的视频显示写出来供大家参考,主要涉及opencv在win32和mfc中显示视频。

一:Win32+OpenCV

#include "highgui.h"
int main()
{
	const char *showwindow= "image";//窗口名字
	CvCapture *capture = NULL;
	capture=cvCaptureFromAVI("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=cvCaptureFromAVI(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中的其它地方,也是一样的好用,编译的时候可能还需要加部分头文件。希望能帮到需要它的朋友,如果有错还请指出,共同学习交流。

OpenCV基础篇——视频显示

时间: 2024-08-09 14:48:41

OpenCV基础篇——视频显示的相关文章

OpenCV基础篇——环境搭建

在开始使用opencv的时候第一步就是搭建环境,关于opencv的环境搭建其实很简单,网上也有很多,一般来说才开始学习都会搭建环境很多次,至少我是这样的.这样对问题的排除有很很大的帮助.现在就把我的搭建方式分享一下: 一.opencv+vs2010 1.opencv的获取: 最好从opencv的官网获取,也可以从opencv的官方中文论坛获取:http://wiki.opencv.org.cn/index.php/%E9%A6%96%E9%A1%B5 我使用的是opencv2.4.4版的,基本上

OpenCV基础篇之读取显示图片

程序及分析 /* * FileName : read.cpp * Author : xiahouzuoxin @163.com * Version : v1.0 * Date : Tue 13 May 2014 07:34:25 PM CST * Brief : * * Copyright (C) MICL,USTB */ #include <cv.h> #include <highgui.h> using namespace cv; using namespace std; in

OpenCV基础篇——图片显示

继上文,做好opencv的配置以后,很多时候要用的就是显示图片,后面要讲的显示视频和一些测试也是建立在显示图片的基础上的,本次将分享opencv通过win32控制台显示图片和MFC显示图片: 一:OpenCV+win32 建立好win32空文档后,添加新项cpp文件后,直接上代码: #include "highgui.h" //这个头文件很多时候都会用到,在opencv中 int main() { IplImage* img = cvLoadImage( "E:\\lena.

opencv——基础篇

一 . opencv是什么及其作用? OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux.Windows.Android和Mac OS操作系统上.它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python.Ruby.MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法(百度百科). 鉴于本人的工作环境主要是采用python作为开发工具,故本篇博客是基于python来做的学习记录. 二 . 环境依赖和opencv包 环

OpenCV基础篇之图像的DFT频域变换

转载请注明出处:http://xiahouzuoxin.github.io/notes 程序及分析 /* * FileName : fft2.cpp * Author : xiahouzuoxin @163.com * Version : v1.0 * Date : Wed 30 Jul 2014 09:42:12 PM CST * Brief : * * Copyright (C) MICL,USTB */ #include <iostream> #include <cv.h>

OpenCV基础篇——图形图像旋转

以前在做图像处理的时候用到了图像的旋转,opencv自带的flip函数只能180度,因为需要旋转任意角度,顺时针和逆时针的情况,所以去找了些效果比较好的函数来实现.网上有的旋转函数有内存泄露的现象,现在把修改过我用过的无内存泄露的函数分享一下: 一: void cvRotate(IplImage* src,int angle) { IplImage * dst = 0; dst = cvCloneImage (src); double delte = 1.0; double factor = 1

OpenCV基础篇之画图及RNG随机数对象

程序及分析 /* * FileName : random_gen.c * Author : xiahouzuoxin @163.com * Version : v1.0 * Date : Tue 29 Jul 2014 08:31:41 PM CST * Brief : * * Copyright (C) MICL,USTB */ #include <cv.h> #include <highgui.h> #include <iostream> using namespa

什么是图像 -- opencv基础

opencv基础篇--到底什么是图像 什么是图像?英语中有两个单词来形容图像,一个是picture,一个是image.这两者虽然是形容同一个东西,但却又有着区别.picture代表实而有物的真实图像:而image代表着计算机中存储的图像,也代表想象中的图像. 而我们更多研究的便是image,计算机图像从广义地可分为矢量图和像素图(位图).矢量图,是由一系列计算机指令描述和记录的一幅图,一幅图可以解为一系列由点.线.面等组成的子图.像素图,则是由很多个点组成的,每个点都是由二进制数据来描述和存储其

Qt图像处理专题之基础篇

马上转行开始做图像处理的工作了,先学习一些基础的图像处理的知识,但是有时候想要验证一个简单的算法,还是想要能够直接的看到效果,所以想要编写一个软件框架了.关于图像处理方面的算法库很多了,其中比较流行的有OpenCV,这个会在另外一个专题里面涉及.而本人是长期从事Qt软件开发的,有些简单的工作还是更加喜欢在Qt中实现,并且在有些嵌入式应用程序开发中我们并不一定有足够的资源来移植一个庞大的OpenCV库,可能简单的几行C/C++代码就能够搞定的.出于这个原因,我打算写一个专题,自己来实现一些图像处理