跳帧及使用线程将获取下一帧与处理当前帧同时进行
来源:互联网 发布:视频加速软件 编辑:程序博客网 时间:2024/05/16 07:49
一、前言
对视频进行处理时,为了达到实时处理的效果,可以不必处理每一帧,以下为间隔几帧处理视频,并使用Linux的pthread多线程机制将获取下一帧与处理当前帧异步进行的一个例子
二、代码
//main.c #include <opencv2/highgui/highgui_c.h> #include <opencv2/core/core_c.h> #include <opencv2/imgproc/imgproc_c.h> #include <stdio.h> #include <pthread.h> static IplImage *in; static IplImage *det; static IplImage *disp; static CvCapture *cap; IplImage* get_frame_from_video(CvCapture *cap , int frame_skip); void *fetch_in_thread(void *ptr); void *process_in_thread(void *ptr); int main() { cap = cvCaptureFromFile("../../video2.mp4"); if(!cap) error("Couldn't connect to video.\n"); pthread_t fetch_thread; pthread_t process_thread; fetch_in_thread(0); det = in; cvNamedWindow("Demo" , 1); while(1){ if(pthread_create(&fetch_thread, 0, fetch_in_thread, 0)) error("Thread creation failed"); //创建线程获取下一帧图像 if(pthread_create(&process_thread, 0, process_in_thread, 0)) error("Thread creation failed"); //创建线程处理当前帧 pthread_join(fetch_thread, 0); pthread_join(process_thread, 0); cvWaitKey(1); cvShowImage("Demo" , disp ); cvReleaseImage(&disp); det = in; } cvreleasecapture(&cap); return 0; } IplImage* get_frame_from_video(CvCapture *cap, int frame_skip) //间隔frame_hop-1 帧从视频结构读取视频帧 { IplImage* _src; static unsigned int counter = 0; while (counter++ %(frame_skip+1) != 1){ _src = cvQueryFrame(cap); if (!_src){ return NULL; } } _src = cvQueryFrame(cap); if (!_src){ return NULL; } IplImage *out = cvCloneImage(_src); return out; } void *fetch_in_thread(void *ptr) //获取帧 { in = get_frame_from_video(cap , 2); // if(in == NULL){ error("no frame readed!"); } } void *process_in_thread(void *ptr) //处理帧 { IplImage *dst_gray = cvCreateImage(cvGetSize(det),det->depth,1); cvCvtColor(det,dst_gray,CV_BGR2GRAY); //得到灰度图 cvReleaseImage(&det); disp = dst_gray;}三、运行
在当前目录下使用gcc -o main main.c `pkg-config --cflags --libs opencv` -lpthread 编译链接生成可执行文件
0 0
- 跳帧及使用线程将获取下一帧与处理当前帧同时进行
- 使用线程同时处理一个DataTable
- C#中获取当前时间,及处理时间(对时间进行加减)
- 使用OnTouchListener同时处理onClick与onLongClick
- 获取当前线程句柄
- 获取当前线程状态
- 获取当前线程名称
- 获取当前使用的浏览器与操作系统
- .net使用线程与线程处理
- 同时使用MSTest与NUnit进行单元测试设置
- python相关的文件处理与获取当前时间
- 将业务及数据库相关操作放入单独线程处理
- 线程范围内共享数据(1)--》自己创建Map进行数据与当前线程的绑定
- C#“必须先将当前线程设置为单个线程单元(STA)模式方可进行OLE调用”异常解决方案
- Android: 获取当前线程状态
- Android: 获取当前线程状态
- Java中获取当前时间及与字符串转换
- python多线程获取网络数据,与单线程进行比较
- [置顶] AndroidStudio导入项目总是不成功之终极解决方案
- DirectX导图(3):渲染管线
- SQLite同时读报错null pointer openOrCreateDatabase(java.lang.String, int, android.database.sq
- DirectX导图(4):画图
- EDA软件_PCB板覆铜
- 跳帧及使用线程将获取下一帧与处理当前帧同时进行
- php empty()出错,Fatal error: Can’t use function return
- ANDROID 开发常用的框架、工具、API最全集合
- Spring MVC(三)封装表单参数的控制器(AbstractController)
- View绘制详解(三),扒一扒View的测量过程
- git push 使用ssh
- UOJ 171 [WC2016]挑战NPC
- LightOJ 1038 Race to 1 Again【概率DP】
- DirectX导图(5):色彩