c++基于opencv使用摄像头识别定位追踪蓝色物体,并给出一个界面的代码
时间: 2024-04-02 19:36:05 浏览: 77
基于opencv的颜色追踪程序
好的,这里我为你提供一个基于 Qt 的界面代码,可以实现对蓝色物体的识别、定位和追踪,并且添加了一些界面元素,例如按钮、滑块等等,以实现更加友好的用户界面。
首先需要安装 Qt 开发环境和 OpenCV 库,并在 Qt 项目中添加 OpenCV 库的链接。
下面是代码示例:
mainwindow.h 文件:
```c++
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QTimer>
#include <QPushButton>
#include <QLabel>
#include <QSlider>
#include <opencv2/opencv.hpp>
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private:
cv::VideoCapture cap;
cv::Scalar lower_blue;
cv::Scalar upper_blue;
cv::QImage qImg;
cv::Mat frame;
cv::Mat hsv;
cv::Mat mask;
cv::Mat kernel;
std::vector<std::vector<cv::Point>> contours;
QTimer *timer;
QPushButton *startButton;
QPushButton *stopButton;
QLabel *imageLabel;
QSlider *slider;
bool isTracking;
private slots:
void startTracking();
void stopTracking();
void updateFrame();
void setThreshold(int value);
};
#endif // MAINWINDOW_H
```
mainwindow.cpp 文件:
```c++
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
// 初始化界面
setWindowTitle(tr("Blue Object Tracking"));
setFixedSize(800, 600);
startButton = new QPushButton(tr("Start"), this);
startButton->setGeometry(QRect(QPoint(50, 500), QSize(100, 50)));
connect(startButton, SIGNAL(clicked()), this, SLOT(startTracking()));
stopButton = new QPushButton(tr("Stop"), this);
stopButton->setGeometry(QRect(QPoint(200, 500), QSize(100, 50)));
connect(stopButton, SIGNAL(clicked()), this, SLOT(stopTracking()));
imageLabel = new QLabel(this);
imageLabel->setGeometry(QRect(QPoint(50, 50), QSize(640, 480)));
slider = new QSlider(Qt::Horizontal, this);
slider->setGeometry(QRect(QPoint(400, 500), QSize(200, 50)));
slider->setMinimum(0);
slider->setMaximum(255);
slider->setValue(100);
connect(slider, SIGNAL(valueChanged(int)), this, SLOT(setThreshold(int)));
// 初始化摄像头和参数
cap = cv::VideoCapture(0);
if (!cap.isOpened())
{
qDebug() << "Error: Could not open camera.";
exit(-1);
}
lower_blue = cv::Scalar(100, 100, 50);
upper_blue = cv::Scalar(130, 255, 255);
kernel = cv::getStructuringElement(cv::MORPH_ELLIPSE, cv::Size(5, 5));
isTracking = false;
// 创建定时器,定时更新图像
timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(updateFrame()));
timer->start(30);
}
MainWindow::~MainWindow()
{
// 释放摄像头和定时器
cap.release();
timer->stop();
delete timer;
// 释放界面元素
delete startButton;
delete stopButton;
delete imageLabel;
delete slider;
}
void MainWindow::startTracking()
{
isTracking = true;
}
void MainWindow::stopTracking()
{
isTracking = false;
}
void MainWindow::updateFrame()
{
// 读取当前帧
cap.read(frame);
// 将当前帧转换到 HSV 颜色空间
cv::cvtColor(frame, hsv, cv::COLOR_BGR2HSV);
// 进行颜色过滤,获取蓝色物体的二值图像
cv::inRange(hsv, lower_blue, upper_blue, mask);
// 对二值图像进行形态学开操作,去掉噪点
cv::morphologyEx(mask, mask, cv::MORPH_OPEN, kernel);
// 如果正在追踪,则进行轮廓检测,获取蓝色物体的轮廓
if (isTracking)
{
cv::findContours(mask, contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE);
}
else
{
contours.clear();
}
// 遍历轮廓,绘制矩形框,并标出物体中心位置
for (std::vector<cv::Point> contour : contours)
{
cv::Rect rect = cv::boundingRect(contour);
cv::rectangle(frame, rect, cv::Scalar(0, 0, 255), 2);
cv::Point center(rect.x + rect.width / 2, rect.y + rect.height / 2);
cv::circle(frame, center, 2, cv::Scalar(0, 255, 0), -1);
cv::putText(frame, "Blue Object", center, cv::FONT_HERSHEY_SIMPLEX, 0.5, cv::Scalar(255, 255, 255), 2);
}
// 将图像转换为 QImage 格式,用于在界面上显示
qImg = QImage((const uchar*)frame.data, frame.cols, frame.rows, frame.step, QImage::Format_RGB888).rgbSwapped();
// 在界面上显示图像
imageLabel->setPixmap(QPixmap::fromImage(qImg));
imageLabel->setScaledContents(true);
}
void MainWindow::setThreshold(int value)
{
lower_blue[0] = value;
}
```
在这个代码中,我们首先在界面中添加了一个“Start”按钮和一个“Stop”按钮,用于控制是否进行追踪,以及一个滑块,用于调整颜色过滤的阈值。然后,我们在 MainWindow 类中添加了一些成员变量,包括摄像头对象、颜色阈值、界面元素等等。
在构造函数中,我们初始化了界面元素,打开了默认的摄像头,并创建了一个定时器,每隔 30 毫秒就更新一次界面显示的图像。在定时器的槽函数中,我们读取当前帧,将其转换到 HSV 颜色空间,进行颜色过滤和形态学操作,然后进行轮廓检测,获取蓝色物体的轮廓,并遍历轮廓,绘制矩形框和标出物体中心位置。最后,我们将图像转换为 QImage 格式,用于在界面上显示。
在界面中,“Start”按钮和“Stop”按钮分别连接到了 startTracking() 和 stopTracking() 槽函数,用于控制是否进行追踪。滑块连接到了 setThreshold() 槽函数,用于调整颜色过滤的阈值。
注意,由于 OpenCV 的图像格式是 BGR,而 QImage 的格式是 RGB,所以在将图像转换为 QImage 格式时,需要使用 rgbSwapped() 函数进行颜色通道的交换。
希望这个示例代码对你有所帮助!
阅读全文