OpenCV从AVI视频提取图片

使用OpenCV提取AVI里的视频(不限制avi格式,只要opencv支持的格式都行,同样来源也可以是摄像头),每隔几帧保存一张。

1.使用cvGrabFrame()+cvRetrieveFrame()

#include <iostream>
#include <cv.h>
#include <cxcore.h>
#include <highgui.h>

#pragma comment(lib, "ml.lib")
#pragma comment(lib, "cv.lib")
#pragma comment(lib, "cvaux.lib")
#pragma comment(lib, "cvcam.lib")
#pragma comment(lib, "cxcore.lib")
#pragma comment(lib, "cxts.lib")
#pragma comment(lib, "highgui.lib")
#pragma comment(lib, "cvhaartraining.lib")

int main()
{
	CvCapture *capture = NULL;
	IplImage *frame = NULL;
	char *AviFileName = "D:\\clock.avi";//视频的目录
	char *AviSavePath = "D:\\截图\\";//图片保存的位置
	const int jiange = 2;//间隔两帧保存一次图片
	capture = cvCaptureFromAVI(AviFileName);
	cvNamedWindow("AVI player",1);
	int count_tmp = 0;//计数总帧数
	char tmpfile[100]={'\0'};
	while(true)
	{
		if(cvGrabFrame(capture))
		{
			if (count_tmp % jiange == 0)
			{
				frame=cvRetrieveFrame(capture);
				cvShowImage("AVI player",frame);//显示当前帧
				sprintf(tmpfile,"%s//%d.jpg",AviSavePath,count_tmp);//使用帧号作为图片名
				cvSaveImage(tmpfile,frame);
			}				
			if(cvWaitKey(10)>=0) //延时
				break;
			++count_tmp;
		}
		else
		{
			break;
		}
	}
	cvReleaseCapture(&capture);
	cvDestroyWindow("AVI player"); 
	std::cout<<"总帧数" << count_tmp << std::endl;
	return 0;
}


2.使用 cvQueryFrame()

#include <iostream>
#include <cv.h>
#include <cxcore.h>
#include <highgui.h>

#pragma comment(lib, "ml.lib")
#pragma comment(lib, "cv.lib")
#pragma comment(lib, "cvaux.lib")
#pragma comment(lib, "cvcam.lib")
#pragma comment(lib, "cxcore.lib")
#pragma comment(lib, "cxts.lib")
#pragma comment(lib, "highgui.lib")
#pragma comment(lib, "cvhaartraining.lib")

int main()
{
	CvCapture *capture = NULL;
	IplImage *frame = NULL;
	char *AviFileName = "D:\\clock.avi";
	char *AviSavePath = "D:\\截图2\\";
	const int jiange = 2;//间隔两帧保存一次图片
	capture = cvCaptureFromAVI(AviFileName);
	cvNamedWindow("AVI player",1);
	int count_tmp = 0;//计数 总帧数
	char tmpfile[100] = {'\0'};
	while( (frame = cvQueryFrame(capture)) != NULL)
	{
		if (count_tmp % jiange == 0)
		{
			cvShowImage("AVI player", frame);//显示当前帧
			sprintf(tmpfile,"%s//%d.jpg", AviSavePath, count_tmp);//使用帧号作为图片名
			cvSaveImage(tmpfile, frame);
		}				
		if(cvWaitKey(10)>=0) //延时
		{	break; }
		++count_tmp;
	}
	cvReleaseCapture(&capture);
	cvDestroyWindow("AVI player"); 
	std::cout << "总帧数" << count_tmp << std::endl;
	return 0;
}

参考资料:

OpenCV 获取摄像头,新建窗口显示摄像头视频

http://www.cnblogs.com/Anykong/archive/2011/04/09/Anykong_OpenCV2.html

AVI文件的读取并显示

http://blog.csdn.net/lelekyle/article/details/5679135


ps:本人在opencv 2.4.1 + vs2010,编译上述代码通过,但运行出错(同事的就不出错),环境配置是没问题的,估计是库的问题。

而使用opencv 2.4.1+ vc6.0完全正常。不知是神马问题。



  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用OpenCV的Text Detection模块来提取图片中的文字。这里是一个使用OpenCV和Tesseract OCR库的示例代码,可以进行文字检测和提取: ```cpp #include <opencv2/opencv.hpp> #include <opencv2/text.hpp> using namespace std; using namespace cv; using namespace cv::text; int main() { // 读取图像 Mat image = imread("image.jpg"); // 转换为灰度图像 Mat gray; cvtColor(image, gray, COLOR_BGR2GRAY); // 创建文本检测器 Ptr<OCRTesseract> ocr = OCRTesseract::create(); // 设置检测器的参数 ocr->setWhitelist("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"); // 定义文本区域检测器 Ptr<ERFilter> er_filter1 = createERFilterNM1(loadClassifierNM1("trained_classifierNM1.xml"), 16, 0.00015f, 0.13f, 0.2f, true, 0.1f); Ptr<ERFilter> er_filter2 = createERFilterNM2(loadClassifierNM2("trained_classifierNM2.xml"), 0.5); // 定义文本检测器 Ptr<ERFilter> er_filters[] = { er_filter1, er_filter2 }; vector<Mat> channels; computeNMChannels(gray, channels); Mat out_img; vector< vector<ERStat> > regions(channels.size()); for (int c = 0; c < channels.size(); c++) { er_filters[c]->run(channels[c], regions[c]); for (int i = 0; i < regions[c].size(); i++) { ERStat er = regions[c][i]; if (er.parent != NULL) continue; // 绘制文本区域 rectangle(image, er.rect, Scalar(0, 255, 0), 2); } } // 显示结果 imshow("Text Detection", image); waitKey(0); // 提取文本 string text; ocr->run(image, text); cout << "Extracted Text: " << text << endl; return 0; } ``` 请确保已安装OpenCV和Tesseract OCR库,并将图像路径替换为您要处理的图像路径。该代码将在图像上执行文本检测,并提取出检测到的文本。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值