当前位置:网站首页>【opencv450】帧间差分法
【opencv450】帧间差分法
2022-06-23 03:55:00 【十年一梦实验室】




实验效果
源码:
/*=================================================
* Version:
* v1.0: 原版程序由IplImage转换为Mat
===================================================
*/
#include <opencv2/highgui.hpp>
#include <opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main(int argc, char* argv[])
{
Mat frame1, frame2, gray1, gray2, dif;
frame1 = imread("0.bmp");
frame2 = imread("3.bmp");
cvtColor(frame1, gray1, COLOR_BGR2GRAY);
cvtColor(frame2, gray2, COLOR_BGR2GRAY);
//Mat C1frame1, C2frema2;
//C1frame1.create(frame1.size(), CV_8UC1);
//C2frema2.create(frame2.size(), CV_8UC1);
Mat F1frame1, F1frame2;
F1frame1.create(frame1.size(), CV_32FC1);
F1frame2.create(frame2.size(), CV_32FC1);
dif.create(frame1.size(), CV_32FC1);
frame1.convertTo(F1frame1, CV_32FC1);
frame2.convertTo(F1frame2, CV_32FC1);
absdiff(F1frame1, F1frame2, dif);
dif.convertTo(dif, CV_8UC1);
threshold(dif, dif, 30, 255, cv::THRESH_BINARY);
int g_nStructElementSize = 3; //结构元素(内核矩阵)的尺寸//
// 获取自定义核
Mat element = getStructuringElement(MORPH_RECT,
Size(2 * g_nStructElementSize + 1, 2 * g_nStructElementSize + 1),
Point(g_nStructElementSize, g_nStructElementSize));
// 膨胀//
dilate(dif, dif, element);
// 腐蚀//
erode(dif, dif, element);
resize(frame1, frame1, Size(478, 400));
resize(frame2, frame2, Size(478, 400));
resize(dif, dif, Size(478, 400));
imshow("frame1", frame1);
imshow("frame2", frame2);
imshow("dif", dif);
if (waitKey(0) != -1)
{
destroyAllWindows();
}
//VideoCapture capture;
//capture = VideoCapture("./Camera Road 01.avi");
//if (!capture.isOpened())
//{
// capture = VideoCapture("../Video/Camera Road 01.avi");
// if (!capture.isOpened())
// {
// capture = VideoCapture("../../Video/Camera Road 01.avi");
// if (!capture.isOpened())
// {
// cout << "ERROR: Did't find this video!" << endl;
// return 0;
// }
// }
//}
用于遍历capture中的帧,通道数为3,需要转化为单通道才可以处理//
//Mat tmpFrame, tmpFrameF;
当前帧,单通道,uchar / Float
//Mat currentFrame, currentFrameF;
上一帧,单通道,uchar / Float
//Mat previousFrame, previousFrameF;
//int frameNum = 0;
//capture >> tmpFrame;
//while (!tmpFrame.empty())
//{
// capture >> tmpFrame;
// //tmpFrame=cvQueryFrame(capture);
// frameNum++;
// if (frameNum == 1)
// {
// //第一帧先初始化各个结构,为它们分配空间//
// previousFrame.create(tmpFrame.size(), CV_8UC1);
// currentFrame.create(tmpFrame.size(), CV_8UC1);
// currentFrameF.create(tmpFrame.size(), CV_32FC1);
// previousFrameF.create(tmpFrame.size(), CV_32FC1);
// tmpFrameF.create(tmpFrame.size(), CV_32FC1);
// }
// if (frameNum >= 2)
// {
// //转化为单通道灰度图,此时currentFrame已经存了tmpFrame的内容//
// cvtColor(tmpFrame, currentFrame, cv::COLOR_BGR2GRAY);
// currentFrame.convertTo(tmpFrameF, CV_32FC1);
// previousFrame.convertTo(previousFrameF, CV_32FC1);
// //做差求绝对值//
// absdiff(tmpFrameF, previousFrameF, currentFrameF);
// currentFrameF.convertTo(currentFrame, CV_8UC1);
// /*
// 在currentFrameMat中找大于20(阈值)的像素点,把currentFrame中对应的点设为255
// 此处阈值可以帮助把车辆的阴影消除掉
// */
// // threshold(currentFrameF, currentFrame, 20, 255.0, CV_THRESH_BINARY);
// threshold(currentFrame, currentFrame, 30, 255, cv::THRESH_BINARY);
// int g_nStructElementSize = 3; //结构元素(内核矩阵)的尺寸//
// // 获取自定义核
// Mat element = getStructuringElement(MORPH_RECT,
// Size(2 * g_nStructElementSize + 1, 2 * g_nStructElementSize + 1),
// Point(g_nStructElementSize, g_nStructElementSize));
// // 膨胀//
// dilate(currentFrame, currentFrame, element);
// // 腐蚀//
// erode(currentFrame, currentFrame, element);
// }
// //把当前帧保存作为下一次处理的前一帧//
// cvtColor(tmpFrame, previousFrame, cv::COLOR_BGR2GRAY);
// // 显示图像
// imshow("Camera", tmpFrame);
// imshow("Moving Area", currentFrame);
// waitKey(25);
//}
// destroyAllWindows();
}
边栏推荐
- 经济发展由新技术推动着来
- SwiftUI 2.0 课程笔记 Chapter 5
- Cookie-Session讲解
- Getting started with the shutter AppBar
- SwiftUI 2.0 课程笔记 Chapter 4
- A bug in rtklib2.4.3 B34 single point positioning
- vmware网络连接出错Unit network.service not found
- UnityShader入门精要——Unity中的渲染优化技术(四)
- 李宏毅《机器学习》丨5. Tips for neural network design(神经网络设计技巧)
- Investment risk management
猜你喜欢

Arduino火焰传感器(含代码)

Drag and drop拖放框架

Baidu PaddlePaddle's "universal gravitation" first stop in 2022 landed in Suzhou, comprehensively launching the SME empowerment plan

STP summary

618如何冲出重围?海尔智家:做好用户的数字化

计算欧式距离和余弦相似度

insert into... where not exists插入避免重复的使用

Penetration test basis | attached test points and test scenarios

当SBAS遇上rtklib

使用teqcplot对teqc 质量分析结果进行可视化展示
随机推荐
Introduction and use of precise ephemeris
Beyond chips and AI, why is hard technology capital becoming more and more "hard core"?
rtklib2.4.3 b34 单点定位的一个bug
戏问花门酒家翁
Course design C for freshmen -- clothing management system
JDBC调用存储过程、MySQL触发器
618如何冲出重围?海尔智家:做好用户的数字化
618 how to break through the siege? Haier Zhijia: do a good job in digitalization of users
Implementation of the rotation chart
This markdown artifact will be charged!
【Mac】安全性与隐私中没有任何来源选项
MMDeploy快速安装及使用说明
Swiftui 2.0 course notes Chapter 4
微信小程序:爱情保证书制作生成
PRCS-1016 : Failed to resolve Single Client Access Name
PHP move_uploaded_file上传移动图片失败
Getting started with the shutter AppBar
使用teqcplot对teqc 质量分析结果进行可视化展示
同步国内AOSP代码相关错误
单行或多行文本溢出,省略号代替