【OpenCV学习笔记】五、实例应用一

这一章的内容:

主要利用了sprintf格式化图片名的小技巧,结合之前读写图片读写视频的方法,完成了以下三个小应用:

1.批量读取图片(有序),并显示

2.视频分解成图片

3.图片合成视频

代码1:批量读取图片(有序),并显示

///批量读取图片(有序),并显示
#include "opencv2/opencv.hpp"
#include <iostream>
using namespace cv;
using namespace std;

void main()
{
	char fileName[50];   //char型数组记录图片名
	char winName[50];    //char型数组记录窗口名
	Mat srcImg;          //定义Mat型变量srcImg
	for(int i = 1; i<101; i++)   //循环100次,读取100张图片
	{
		sprintf(fileName, "E:\\pic\\%d.bmp", i);//利用sprintf格式化图片名fileName
		sprintf(winName, "NO--%d", i); //利用sprintf格式化窗口名winName
		srcImg = imread(fileName);     //将名为fileName的图片读进srcImg
		if(srcImg.empty())             //对srcImg的异常检测
			break;
		imshow(winName, srcImg);       //在winName窗口显示图片srcImg
	}
	waitKey(0);
	destroyAllWindows();
}

运行结果:读取了E:\pic\中的100张图片(文件名有有序%d.bmp),并显示

代码2:视频分解成图片

///视频分解成图片
#include "opencv2/opencv.hpp"
#include <iostream>
using namespace cv;
using namespace std;

void main()
{
	Mat frame;
	char outfile[50];

	VideoCapture cap("2.avi"); //创建VideoCapture类读视频
	if(!cap.isOpened())         //判断是否成功打开视频
		return;

	int totalFrame = cap.get(CV_CAP_PROP_FRAME_COUNT); //VideoCapture类的get方法获取视频总帧数

	for(int i = 1; i<=totalFrame; i++)     //for循环totalFrame次
	{
		cap>>frame;                 //读取每一帧
		if(frame.empty())           //判断帧异常
			break;
		sprintf(outfile, "E:\\pic\\%d.bmp", i); //利用sprintf格式化图片名
		imwrite(outfile, frame);    //保存每一帧到目标地址
		imshow("video", frame);
		waitKey(15);
	}
	cap.release();
	destroyAllWindows(); 
}

运行结果:将2.avi的所有帧分解成图片,保存在了本地。


 

代码3:图片合成视频

///图片合成视频
#include "opencv2/opencv.hpp"
#include <iostream>
using namespace cv;
using namespace std;

void main()
{
    //创建VideoWriter类写视频到本地
	VideoWriter writer("E:\\out.avi", CV_FOURCC('X', 'V', 'I', 'D'), 20, Size(568, 320), true);
	//VideoCapture cap;
	char filename[50];
	Mat frame;
	for(int i = 1; i<644; i++)
	{
		sprintf(filename, "E:\\pic\\%d.bmp", i);
		frame = imread(filename);   //读图片的方法(一句就行)
		//cap.open(filename); //读视频的方法(以下四句)
		//if(!cap.isOpened()) 
		//	break;           
		//cap>>frame;         
		if(frame.empty())     //检测帧异常
			break;
		writer<<frame;        //写入帧
	}
	cout<<"write end!"<<endl;
	destroyAllWindows();
}

运行结果:将上一个代码中分解出来的图片,重新合成了视频文件out.avi


 

前言: 开源的opencv真是一件伟大的产品,那么多个函数跟变量(具体多少还没数过)。要是结合起来综合运用几乎可以胜任任何有关图像识别和处理方面的工作。如果能更深入一点根据具体需要修改或优化里面的源码那更是如虎添翼。 花了点时间浏览了www.opencv.org.cn论坛里的所有贴子,还好不多才200多页。总体上对opencv里的一些常用函数功能作用大致有点了解,筛选一些跟元件识别有关的运用内容,但它论坛里的贴子回复的内容点到即止的居多。从网上下载了能搜到的教程跟代码全学习了解测试了一下,图像处理流程通常先开始都是要进行滤波,除燥,灰度,二值化后再轮廓识别等。 开始动手 经过多次好多次运行测试组合,终于有一次显示出意外的惊人效果,而且相当简单只是调用了几个函数而以,就可以有这样效果实在出人意料。第一个是进行元件心点获取,也是直接调用函数再加点东西就可以得出元件的四个矩形顶点坐标,有这几个坐标就可以直接算出元件间点所在的坐标了。如果要检测元件摆放角度是否是垂直90度,只要判断边宽的长度为最小或最大时就是垂直90度。 但这个矩形框无法测出元件具体角度。如截图: 测试视频地址:https://v.youku.com/v_show/id_XMjU5NzY5NTI0.html 不过,还有另外一个函数可以提供这个功能,调用后可以直接求出最小外接矩形和角度 如截图: 测试视频地址:https://v.youku.com/v_show/id_XMjYwMDMzMDc2.html 说明:里面的光源不行,临时用手电筒,和在光盘上插几个LED做环形灯做照明,无法做到无阴影显示。如果光源做的好,效果应该是非常精确稳定。 识别包含下面2种做法: opencv里需要的头文件跟库文件都已编译好放在和设置在当前程序目录下,就可不用安装opencv 也能直接编译。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值