opencv求轮廓面积的函数 C++实例
时间: 2024-03-21 14:13:48 浏览: 14
以下是使用OpenCV库中的函数计算轮廓面积的C语言示例:
```c
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main()
{
Mat img = imread("test.jpg");
cvtColor(img, img, COLOR_BGR2GRAY);
threshold(img, img, 128, 255, THRESH_BINARY);
vector<vector<Point> > contours;
findContours(img, contours, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);
for (int i = 0; i < contours.size(); i++)
{
double area = contourArea(contours[i]);
cout << "Contour " << i + 1 << " Area: " << area << endl;
}
return 0;
}
```
首先,加载测试图像并将其转换为灰度图像。然后,使用阈值函数将其二值化。接下来,使用findContours函数找到图像中的轮廓,并将其存储在contours向量中。最后,使用contourArea函数计算每个轮廓的面积,并将其打印到控制台上。
相关问题
QT使用opencv实现物体动态监测代码实例
以下是一个基于Qt和OpenCV的物体动态监测的简单代码示例。该示例使用了一个摄像头来捕获视频,并使用OpenCV中的运动检测算法来检测图像中的运动物体。
代码示例:
mainwindow.h 文件:
```c++
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <opencv2/opencv.hpp>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private:
Ui::MainWindow *ui;
cv::VideoCapture cap;
cv::Mat prev_frame;
bool first_frame;
cv::Scalar lower_bound;
cv::Scalar upper_bound;
private slots:
void on_actionOpen_triggered();
void on_actionExit_triggered();
void processFrame();
};
#endif // MAINWINDOW_H
```
mainwindow.cpp 文件:
```c++
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow),
first_frame(true),
lower_bound(30, 30, 0),
upper_bound(100, 100, 255)
{
ui->setupUi(this);
// 设置摄像头
cap.open(0);
if(!cap.isOpened())
{
ui->statusBar->showMessage(tr("Cannot open camera!"));
return;
}
// 启动定时器
connect(&timer, SIGNAL(timeout()), this, SLOT(processFrame()));
timer.start(30);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::processFrame()
{
cv::Mat frame;
cap >> frame;
// 转换为灰度图像
cv::Mat gray_frame;
cv::cvtColor(frame, gray_frame, CV_BGR2GRAY);
// 初始化前一帧
if(first_frame)
{
prev_frame = gray_frame.clone();
first_frame = false;
return;
}
// 计算帧间差异
cv::Mat diff_frame;
cv::absdiff(prev_frame, gray_frame, diff_frame);
// 二值化差异图像
cv::Mat threshold_frame;
cv::threshold(diff_frame, threshold_frame, 50, 255, CV_THRESH_BINARY);
// 模糊处理
cv::Mat blur_frame;
cv::GaussianBlur(threshold_frame, blur_frame, cv::Size(5,5), 0);
// 查找轮廓
std::vector<std::vector<cv::Point>> contours;
cv::findContours(blur_frame, contours, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE);
// 绘制轮廓
cv::Scalar color(0, 255, 0);
for(unsigned int i = 0; i < contours.size(); i++)
{
cv::drawContours(frame, contours, i, color, 2);
}
// 更新前一帧
prev_frame = gray_frame.clone();
// 显示结果
cv::imshow("Video", frame);
}
void MainWindow::on_actionOpen_triggered()
{
// 打开视频文件
QString filename = QFileDialog::getOpenFileName(this, tr("Open Video"), ".", tr("Video Files (*.avi *.mpg *.mp4)"));
if(filename.isEmpty())
{
return;
}
cap.open(filename.toStdString());
if(!cap.isOpened())
{
ui->statusBar->showMessage(tr("Cannot open video file!"));
return;
}
// 启动定时器
connect(&timer, SIGNAL(timeout()), this, SLOT(processFrame()));
timer.start(30);
}
void MainWindow::on_actionExit_triggered()
{
// 停止摄像头或视频
cap.release();
// 关闭窗口
close();
}
```
该示例中,processFrame() 函数会被定时器定期调用,以捕获视频帧并处理。首先,将帧转换为灰度图像,然后计算与前一帧之间的差异。使用二值化和模糊处理来减少噪声,并查找轮廓以检测运动物体。最后,绘制轮廓并显示帧。
示例中还提供了一些其他功能,例如打开视频文件和退出应用程序的选项。用户可以使用菜单栏中的“文件”菜单来打开视频文件或退出应用程序。
请注意,该示例中的运动检测算法非常简单,并且可能不适用于所有情况。可以尝试使用其他算法或使用参数调整来优化结果。
c++ opencv trackerkcf
TrackerKCF 是 OpenCV 中的一个目标跟踪器,它基于 Kernelized Correlation Filters(KCF)算法实现。KCF 算法一种基于相关波器的目标跟踪算法,它可以在不同的场景下实现实时的目标跟踪。
使用 TrackerKCF 跟踪器,你可以在视频中实时跟踪目标的位置。以下是一个简单的示例代码,展示了如何使用 TrackerKCF 进行目标跟踪:
```cpp
#include <opencv2/opencv.hpp>
int main() {
cv::VideoCapture video("input.mp4");
if (!video.isOpened()) {
return -1;
}
cv::Mat frame;
video.read(frame);
cv::Rect2d roi = cv::selectROI(frame, false);
cv::Ptr<cv::Tracker> tracker = cv::TrackerKCF::create();
tracker->init(frame, roi);
while (video.read(frame)) {
bool ok = tracker->update(frame, roi);
if (ok) {
cv::rectangle(frame, roi, cv::Scalar(0, 255, 0), 2);
} else {
cv::putText(frame, "Tracking failure detected", cv::Point(100, 80), cv::FONT_HERSHEY_SIMPLEX, 0.75, cv::Scalar(0, 0, 255), 2);
}
cv::imshow("Object Tracking", frame);
if (cv::waitKey(1) == 27) {
break;
}
}
video.release();
cv::destroyAllWindows();
return 0;
}
```
在这个示例中,我们首先从视频中读取一帧图像,并使用 `cv::selectROI` 函数选择目标的初始位置(使用鼠标拖动选择)。然后,我们创建一个 TrackerKCF 实例并使用 `init` 函数初始化跟踪器。之后,我们进入一个循环,不断读取视频的下一帧,并使用 `update` 函数更新目标的位置。最后,我们在图像上绘制目标的位置,并显示在窗口中。
请确保你已经正确安装了 OpenCV 库,并将示例代码中的 `input.mp4` 替换为你要跟踪的视频文件路径。希望这能帮到你!如果有任何问题,请随时问我。