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的搭建參考上一个博客. 首先简 ...
随机推荐
- try与except处理异常语句
ji 简介 与其他语言相同,在python中,try/except语句主要是用于处理程序正常执行过程中出现的一些异常情况,如语法错(python作为脚本语言没有编译的环节,在执行过程中对语法进行检测, ...
- dedecmsv5.7 前台模版里输出变量
如何在PHP文件查询出来的数据赋值给前端页面展示出来? 例如: PHP文件:agency.php require_once(dirname(__FILE__) . '/../../include/co ...
- SpringMVC+Shiro整合配置文件详解
http://blog.csdn.net/dawangxiong123/article/details/53020424
- dubbo 异步回调
dubbo 异步回调的使用 业务接口: public interface HelloService { String sayHello(); void sayHi(String name); } 回调 ...
- Php基本类型学习
1.8种基本的数据类型 1)四种基本类型 boolean (布尔类型) integer(整形类型) double (双精度类型) string (字符串类型) 2)两种复合类型 array (数组 ...
- Win10系列:C#应用控件基础19
ScrollViewer控件 ScrollViewer控件包含一个水平和一个竖直滚动条以及一个可滚动的内容显示区域,在显示区域内可以放置其他可见控件.ScrollViewer控件的水平和垂直滚动条两端 ...
- LeetCode 总结,二叉树各种类型问题小结
三大遍历 前序遍历 中序遍历 后序遍历 关于三大基础遍历,必须要条件反射式的记住:三种遍历的迭代方式使用的都是栈,后序遍历必须使用了 两个栈,其余乱七八糟的解决方式统统就不要再记了. 广度遍历: 分析 ...
- Mysql 截取日期的方法
//显示年月日 select date_format(date ,'%Y-%m-%d' ) from talbe_a //根据年月日分组 select date_format(date ,'%Y-%m ...
- VSTO:使用C#开发Excel、Word【17】
使用Range对象Range对象表示电子表格中的单元格范围.范围可以包含一个单元格,多个连续的单元格,甚至多个不连续的单元格.您可以在Excel中选择时按住Ctrl键选择多个不连续的单元格. 获取特定 ...
- Linux磁盘格式化
CentOS7所支持的文件系统格式:默认是用xfs作为系统的文件系统. "/"和"/boot"都是xfs格式! [root@linux-xl ~]# cat / ...