/**
* @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::将两幅图像合并后,在同一个窗口显示;并将合并的图像流保存成视频文件的更多相关文章

  1. [转]MFC子线程更改图像数据后更新主窗口图像显示方法

    程序思路是由外部的输入输出控制卡发出采集图像信号,之后相机采集图像得到图像数据指针,接收图像数据指针创建成图像最后显示到MFC对话框应用程序的Picture Control控件上,同时,为了标定相机位 ...

  2. Opencv实现两幅图像融合

    实现两幅图像线性(不同系数下)的融合涉及到Opencv中两个关键的方法,addWeighted()和createTrackbar() addWeighted方法: 函数原型: void addWeig ...

  3. OpenCv实现两幅图像的拼接

    直接贴上源码 来源:http://www.myexception.cn/image/1498389.html 实验效果 Left.jpg right.jpg ImageMatch.jpg #inclu ...

  4. OpenCV --- 实现两幅图像并排合并(ROI)

    Mat img1 = imread("1.png"); Mat img2 = imread("2.png"); int height = img1.rows; ...

  5. OpenCV 对两幅图像求和(求混合(blending))

    #include <cv.h> #include <highgui.h> #include <iostream> using namespace cv; int m ...

  6. Opencv——将摄像头拍摄写成视频文件

    这里主要利用了Opencv打开摄像头的代码,以及写入视频的函数,只是这里要注意的是摄像头好像没有帧率,在cvCreateVideoWriter,时要自己设置 #include"cv.h&qu ...

  7. maltab-图像拼接(左右两幅图)

    图像拼接 参考自 https://blog.csdn.net/m0_37565736/article/details/79865990 并修改了其中错误的地方,添加自己的讲解或者看法. 我要拼接的是一 ...

  8. element-ui 使用span-method表格合并后hover样式的处理

    在使用element表格合并后,发现鼠标只有移入第一个合并行时,合并的部分会高亮,移入其他行,不会高亮,这样效果看起来不是很好.查看了文档也没有直接的解决方法,就通过现有的方法处理了一下,解决了hov ...

  9. ffmpeg和opencv 播放视频文件和显示器

    ffmpeg它是基于最新版本,在官网下载http://ffmpeg.zeranoe.com/builds/.编译时VS2010配置相关头文件及库的路径就可以.opencv的搭建參考上一个博客. 首先简 ...

随机推荐

  1. 综述 - 染色质可及性与调控表观基因组 | Chromatin accessibility and the regulatory epigenome

    RNA-seq这个工具该什么时候用?ATAC-seq该什么时候用?有相当一部分项目设计不行,导致花大钱测了一些没有意义的数据. 还是在中心法则这个框架下来解释,这是生物信息的核心.打开华大科技服务官网 ...

  2. HTTP 协议(一)之基本概念入门

    一.网络基础 TCP/IP 计算机与网络设备要相互通信,双方就必须基于相同的方法. TCP/IP 协议族按层次分别分为以下 4层:应用层.传输层.网络层和数据链路层. 应用层: 决定了向用户提供应用服 ...

  3. Javascript原型,原型链?有什么特点?

    如何: js中继承都是通过原型对象实现的 什么是原型对象: 集中存储同一类型的所有子对象,共用成员的父对象 何时: 只要继承,必然原型对象 如何: 创建: 不用创建,买一赠一 每创建一个构造函数,都附 ...

  4. CentOS 6快捷安装RabbitMQ教程

    1.安装Erlang yum install erlang 2.安装RabbitMQ yum install rabbitmq-server 3.配置开机自启动 chkconfig rabbitmq- ...

  5. 【IDE】我的花里胡哨VS

    我的 VS2017 效果图,花里胡哨但十分养眼,利于C/C++ Coding~ 一.主题设置 工具 → 扩展和更新 下载插件 Color Theme Editor for Visual Studio ...

  6. 百度地图API---JS开发

    百度地图API 开源地址:http://lbsyun.baidu.com/index.php?title=jspopular/guide/introduction#Https_.E8.AF.B4.E6 ...

  7. Android 音视频深入 十二 FFmpeg视频替换声音(附源码下载)

    项目地址,求starhttps://github.com/979451341/AudioVideoStudyCodeTwo/tree/master/FFmpeg%E7%BB%99%E8%A7%86%E ...

  8. 破解 JS(原型)继承

    总体分为四大类:利用空对象作为中介继承.Object.create 继承.setPrototypeOf 继承.拷贝继承 function Animal(name, age) { this.name = ...

  9. day72 关于rbac组件的小部分面试题

    rbac的权限组件   基于角色的权限控制 1.什么是权限? url代表的就是一个权限 2.如何实现权限的控制? 表结构  以我们讲的课的内容为例 菜单表: - title 标题 - icon 图标 ...

  10. extern介绍

    存储类说明符extern.之前说过auto (auto int a:)extern的作用是:修饰变量/函数声明,表示是外部变量. e本身就是一个全局变量,所以在全局变量这个位置,加不加extern 都 ...