opencv::将两幅图像合并后,在同一个窗口显示;并将合并的图像流保存成视频文件
/**
* @file main-opencv.cpp
* @date July 2014
* @brief An exemplative main file for the use of ViBe and OpenCV
*/
//#include <opencv2\core\core.hpp>
#include "vibe-background-sequential.h" using namespace cv;
using namespace std; const int minArea = ; // 舍去面积极小的方框
const double maxAreaRatio = 0.1; // 舍去面积极大的方框
const double boxRatio = 0.1; // 舍去长宽比严重失衡的方框 /**
* Displays instructions on how to use this program.
*/
void help()
{
cout
<< "--------------------------------------------------------------------------" << endl
<< "This program shows how to use ViBe with OpenCV " << endl
<< "Usage:" << endl
<< "./main-opencv <video filename>" << endl
<< "for example: ./main-opencv video.avi" << endl
<< "--------------------------------------------------------------------------" << endl
<< endl;
} void processVideo(char* videoFilename); void contour(const Mat &mor, Mat &img); /**
* Main program. It shows how to use the grayscale version (C1R) and the RGB version (C3R).
*/
int main(int argc, char* argv[])
{
/* Print help information. */
help(); /* Check for the input parameter correctness. */
/* if (argc != 2) {
cerr <<"Incorrect input" << endl;
cerr <<"exiting..." << endl;
return EXIT_FAILURE;
} /* Create GUI windows. */
//namedWindow("Frame");
//namedWindow("Segmentation by ViBe"); processVideo("framelink_yd.avi"); //读取 framelink_yd.avi 视频进行处理
/* Destroy GUI windows. */
destroyAllWindows();
return EXIT_SUCCESS;
} /**
* Processes the video. The code of ViBe is included here.
*
* @param videoFilename The name of the input video file.
*/
void processVideo(char* videoFilename)
{
VideoCapture capture(videoFilename); /* Create the capture object. */
if (!capture.isOpened()) {
cerr << "Unable to open video file: " << videoFilename<< endl; /* Error in opening the video input. */
exit(EXIT_FAILURE);
} clock_t start, finish;
double total;
start=clock(); /* Variables. */
static int frameNumber = ; /* The current frame number */
int lastCount = ;
int probFactor = gradient_Factor; /*概率因子,用梯度因子初始化概率因子*/
Mat frame,frame1; /* Current frame. */
Mat segmentationMap; /* Will contain the segmentation map. This is the binary output map. */
int keyboard = ; /* Input from keyboard. Used to stop the program. Enter 'q' to quit. */
char fileName[] = { };
int sampleCounts[] = {};
int speSamples[] = {};
vibeModel_Sequential_t *model = NULL; /* Model used by ViBe. */ int heig = ;
int widt = ;
Mat res = Mat::zeros(heig, widt, CV_8UC3); //res为三通道像素帧,用来保存最后合并的图像 /* 创建保存视频的文件名并打开 */
const string Name = "res.avi";
VideoWriter writer;
Size sz(widt, heig);
writer.open(Name, CV_FOURCC('M', 'J', 'P', 'G'), , sz, true);
while ((char)keyboard != 'q' && (char)keyboard != ) { /* Read input data. ESC or 'q' for quitting. */
if (!capture.read(frame1)) { /* Read the current frame. */
cerr << "Unable to read next frame." << endl;
cerr << "Exiting..." << endl;
break;// exit(EXIT_FAILURE);
} /* Applying ViBe.
* If you want to use the grayscale version of ViBe (which is much faster!):
* (1) remplace C3R by C1R in this file.
* (2) uncomment the next line (cvtColor).
*/
cvtColor(frame1, frame, CV_BGR2GRAY); //将三通道图像帧转换为单通道
if ( frameNumber== ) {
segmentationMap = Mat(frame.rows, frame.cols, CV_8UC1);
model = (vibeModel_Sequential_t*)libvibeModel_Sequential_New();
libvibeModel_Sequential_AllocInit_8u_C1R(model, frame.data, frame.cols, frame.rows);
class_samples(model,frame.data, sampleCounts,speSamples,frame.cols, frame.rows);
} /* ViBe: Segmentation and updating. */
libvibeModel_Sequential_Segmentation_8u_C1R(model, frame.data, segmentationMap.data);
libvibeModel_Sequential_Update_8u_C1R(model, frame.data, segmentationMap.data, &probFactor,frameNumber); medianBlur(segmentationMap, segmentationMap, ); /* 3x3 median filtering */
contour(segmentationMap, frame1); //在原图上框出动目标,至此图像处理完毕 //sprintf(fileName, "results55_2/%06d.jpg",frameNumber);
//imwrite(fileName, frame1); Mat segmentationMap1; //新定义一个帧变量,不能 cvtColor(segmentationMap, segmentationMap, CV_GRAY2BGR),因为 segmentationMap 为单通道帧;
cvtColor(segmentationMap, segmentationMap1, CV_GRAY2BGR); //将单通道帧图像 segmentationMap 转化为三通道segmentationMap1,因为 res 帧为三通道帧图像
// segmentationMap1要合并在 res 中;
/* Shows the current frame and the segmentation map. */
//imshow("Frame", frame1);
//imshow("Segmentation by ViBe", segmentationMap); /* 将 segmentationMap1 和 frame1 合并成一帧存放在 res 中*/
segmentationMap1.copyTo(res(Rect(, , , )));
frame1.copyTo(res(Rect(, , , )));
imshow("res", res); //显示合并后的图像 /* 将 res 写入打开的视频文件中 */
writer << res; //将合并图像写入,连续的图像帧保存为视频文件;
++frameNumber;
keyboard = waitKey(); /* Gets the input from the keyboard. */
} finish=clock();
total=(double)(finish-start);
cout<<total<<endl;
cout<<frameNumber<<endl;
capture.release(); /* Delete capture object. */
libvibeModel_Sequential_Free(model); /* Frees the model. */
} /* 框出运动目标 */
void contour(const Mat &mor, Mat &img)
{
int img_size = img.cols * img.rows;
Mat tmp = (mor == );
// Each detected contour is stored as a vector of points
vector<vector<Point> > contours;
vector<Vec4i> hierarchy; // containing information about the image topology
findContours(tmp, contours, hierarchy, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE);
for (size_t k = ; k < contours.size(); k++) {
Rect rect = boundingRect(contours[k]);
double whratio = double(rect.width) / double(rect.height);
double hwratio = double(rect.height) / double(rect.width);
double ratio = min(hwratio, whratio);
double area = rect.area();
//框出符合条件的轮廓,舍去: 面积很小的, 面积很大的, 长宽比严重失调的
if (area > minArea && area < img_size*maxAreaRatio && ratio > boxRatio) {
int w = rect.width;
int h = rect.height; if(rect.width < )
rect.width = ;
/*
if(rect.width < 6)
rect.width = 2*rect.width;
else
rect.width = rect.width + rect.width/2;
*/
if(rect.height < )
rect.height = ;
/*
if(rect.height < 6)
rect.height = 2*rect.height;
else
rect.height = rect.height + rect.height/2;
*/
int w_add = (rect.width - w)/;
int h_add = (rect.height - h)/;
rect.x = rect.x - h_add;
rect.y = rect.y - w_add; rectangle(img, rect, Scalar(,,));
} }
}
opencv::将两幅图像合并后,在同一个窗口显示;并将合并的图像流保存成视频文件的更多相关文章
- [转]MFC子线程更改图像数据后更新主窗口图像显示方法
程序思路是由外部的输入输出控制卡发出采集图像信号,之后相机采集图像得到图像数据指针,接收图像数据指针创建成图像最后显示到MFC对话框应用程序的Picture Control控件上,同时,为了标定相机位 ...
- Opencv实现两幅图像融合
实现两幅图像线性(不同系数下)的融合涉及到Opencv中两个关键的方法,addWeighted()和createTrackbar() addWeighted方法: 函数原型: void addWeig ...
- OpenCv实现两幅图像的拼接
直接贴上源码 来源:http://www.myexception.cn/image/1498389.html 实验效果 Left.jpg right.jpg ImageMatch.jpg #inclu ...
- OpenCV --- 实现两幅图像并排合并(ROI)
Mat img1 = imread("1.png"); Mat img2 = imread("2.png"); int height = img1.rows; ...
- OpenCV 对两幅图像求和(求混合(blending))
#include <cv.h> #include <highgui.h> #include <iostream> using namespace cv; int m ...
- Opencv——将摄像头拍摄写成视频文件
这里主要利用了Opencv打开摄像头的代码,以及写入视频的函数,只是这里要注意的是摄像头好像没有帧率,在cvCreateVideoWriter,时要自己设置 #include"cv.h&qu ...
- maltab-图像拼接(左右两幅图)
图像拼接 参考自 https://blog.csdn.net/m0_37565736/article/details/79865990 并修改了其中错误的地方,添加自己的讲解或者看法. 我要拼接的是一 ...
- element-ui 使用span-method表格合并后hover样式的处理
在使用element表格合并后,发现鼠标只有移入第一个合并行时,合并的部分会高亮,移入其他行,不会高亮,这样效果看起来不是很好.查看了文档也没有直接的解决方法,就通过现有的方法处理了一下,解决了hov ...
- ffmpeg和opencv 播放视频文件和显示器
ffmpeg它是基于最新版本,在官网下载http://ffmpeg.zeranoe.com/builds/.编译时VS2010配置相关头文件及库的路径就可以.opencv的搭建參考上一个博客. 首先简 ...
随机推荐
- babel-node + Express NodeJS项目搭建指南
1.搭建Node.js环境 从官网下载安装 2.搭建Express环境 express 是 node.js的短精简的Web框架,官网:http://www.expressjs.com.cn/ 安装: ...
- EL条件判断用法<c:choose>
EL表达式一般不直接用==,!=,>,<,>=,<=之类的表示相等.不等于.大于.小于.大于等于以及小于等于,而是使用字母表示,如下: == eq 等于 != ...
- PAT 1058 A+B in Hogwarts
1058 A+B in Hogwarts (20 分) If you are a fan of Harry Potter, you would know the world of magic ha ...
- 依赖注入原理---IoC框架
先来讲一讲,一个简单的依赖注入例子. 1. 依赖 如果在 Class A 中,有 Class B 的实例,则称 Class A 对 Class B 有一个依赖.例如下面类 Human 中用到一个 Fa ...
- MapServer Tutorial——MapServer7.2.1教程学习——第一节:MapServer的基本配置管理,静态地图应用以及MapFile文件
MapServer Tutorial——MapServer7.2.1教程学习——第一节:MapServer的基本配置管理,静态地图应用以及MapFile文件 前言 万事开头难,有了<MapSer ...
- sql多表查询(单表查询略过)
表library: 表borrow: 表reader: 1.等值连接:(常用) 原理:将多张表组合成一个逻辑大表,即字段相加记录相乘(笛卡尔积). 语法:select * from 表A,表B whe ...
- iframe子页面控制父页面滚动高度,直接蹦到父页面开头
zepto调用父页面窗口元素的scrollTop()方法会报错,貌似是scrollTop函数中有个scrollTo()方法用到this,指向错误. 经检查, 原生js控制父页面滚动,只能写数字,不能带 ...
- 洛谷p1067
题目https://www.luogu.org/problemnew/show/P1067 #include<iostream> #include<cstdio> #inclu ...
- linux之基础操作
- 关于pdfbox操作pdf的分享链接手长
http://blog.csdn.net/fighting_no1/article/details/51038966