博客
关于我
OpenCV摄像头读取视频、存取处理后视频的代码流程
阅读量:523 次
发布时间:2019-03-07

本文共 2711 字,大约阅读时间需要 9 分钟。

使用霍夫圆变换检测圆形物体中心的实时应用

一、读取视频源

在本项目中,首先需要从摄像头读取视频流。通过OpenCV库,可以使用VideoCapture类来实现这一点。在代码中,我们使用了以下命令:

VideoCapture capture(1);

二、视频属性获取

为了获取视频的基本属性(如帧数、宽度、高度等),我们可以使用VideoCapture提供的属性获取方法:

int width = capture.get(CV_CAP_PROP_FRAME_WIDTH);int height = capture.get(CV_CAP_PROP_FRAME_HEIGHT);int frameCount = capture.get(CV_CAP_PROP_FRAME_COUNT);int fps = capture.get(CV_CAP_PROP_FPS);

三、视频文件写入

如果需要将捕获的视频流保存到文件中,可以使用VideoWriter类。以下是基本的写入代码结构:

VideoWriter writer;writer.open("output.avi", CV_FOURCC('D', 'I', 'V', 'X'), fps, Size(width, height));

四、实时帧处理

使用while循环来持续读取和处理每一帧视频:

while (true) {    Mat frame;    capture >> frame;    // 转换为灰度图像    Mat gray;    cvtColor(frame, gray, COLOR_BGR2GRAY);    // 应用高斯模糊    GaussianBlur(gray, gray, Size(9, 9), 2, 2);

五、霍夫圆变换实现

在这一步骤中,我们使用霍夫圆变换来检测圆形物体。具体实现如下:

vector
circles;HoughCircles(gray, circles, HOUGH_GRADIENT, 1.5, 10, 200, 100, 0, 0);

六、圆心与轮廓绘制

循环遍历检测到的圆,并绘制它们的圆心和轮廓:

for (size_t i = 0; i < circles.size(); ++i) {    Point center(circles[i][0], circles[i][1]);    int radius = circles[i][2];    circle(frame, center, 3, Scalar(0, 255, 0), -1, 8, 0);    circle(frame, center, radius, Scalar(155, 50, 255), 3, 8, 0);}

七、显示当前帧

使用imshow函数显示当前帧,并使用waitKey函数控制帧显示时间:

imshow("实时视频", frame);waitKey(10);

八、程序退出

当用户按下q键时,程序退出:

if (waitKey(100) & 'q') {    break;}

完整代码示例

#include 
#include
#include
using namespace std;using namespace cv;int main() { VideoCapture capture(1); // 获取视频属性 int width = capture.get(CV_CAP_PROP_FRAME_WIDTH); int height = capture.get(CV_CAP_PROP_FRAME_HEIGHT); int frameCount = capture.get(CV_CAP_PROP_FRAME_COUNT); int fps = capture.get(CV_CAP_PROP_FPS); VideoWriter writer; writer.open("output.avi", CV_FOURCC('D', 'I', 'V', 'X'), fps, Size(width, height)); while (true) { Mat frame; capture >> frame; // 转换为灰度图像 Mat gray; cvtColor(frame, gray, COLOR_BGR2GRAY); // 应用高斯模糊 GaussianBlur(gray, gray, Size(9, 9), 2, 2); // 进行霍夫圆变换 vector
circles; HoughCircles(gray, circles, HOUGH_GRADIENT, 1.5, 10, 200, 100, 0, 0); // 绘制圆心和轮廓 for (size_t i = 0; i < circles.size(); ++i) { Point center(circles[i][0], circles[i][1]); int radius = circles[i][2]; circle(frame, center, 3, Scalar(0, 255, 0), -1, 8, 0); circle(frame, center, radius, Scalar(155, 50, 255), 3, 8, 0); } // 显示当前帧 imshow("实时视频", frame); if (waitKey(100) & 'q') { break; } } return 0;}

总结

通过以上代码,我们可以实现一个实时检测圆形物体中心的应用程序。该程序利用OpenCV库中的VideoCaptureVideoWriter类来读取和写入视频文件,同时使用HoughCircles函数进行霍夫圆变换,从而快速而准确地检测圆形物体的中心位置。

转载地址:http://dfunz.baihongyu.com/

你可能感兴趣的文章
PHP XSS攻击防范--如何过滤用户输入
查看>>
php zookeeper实现分布式锁
查看>>
PHP 中 this,self,parent 的区别、用法
查看>>
PHP 中如何高效地处理大规模数据的排序?
查看>>
PHP 之ftp客户端类封装实现
查看>>
php 代码改进
查看>>
php 代码混淆
查看>>
PHP 使用 $_SERVER['PHP_SELF'] 获取当前页面地址及其安全性问题
查看>>
Redis系列之如何避免缓存击穿
查看>>
php 内存分析
查看>>
PHP 函数名前面加&
查看>>
redis报错
查看>>
php 删除包含某一字符的数组元素
查看>>
Redis学习总结(19)——Redis 5种集群方式对比
查看>>
php 反射
查看>>
php 处理 大并发
查看>>
php 大文件上传
查看>>
php 子进程监听消息,swoole学习笔记之多线程端口监听问题记录 多进程epoll模式...
查看>>
PHP 学习笔记 (四)
查看>>
Redis入门概述
查看>>