C++ contours
时间: 2023-10-25 10:07:43 浏览: 156
您好!关于 C++ 中的 contours,它是指在图像处理中,将图像中的连通区域提取出来的操作。常用的方法是使用 OpenCV 库中的 findContours 函数。该函数可以找到图像中所有的轮廓,并将其存储在一个向量中。您可以通过以下代码实现:
```c++
#include <opencv2/opencv.hpp>
using namespace cv;
int main()
{
Mat img = imread("test.jpg", IMREAD_GRAYSCALE);
threshold(img, img, 128, 255, THRESH_BINARY);
std::vector<std::vector<Point>> contours;
findContours(img, contours, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);
drawContours(img, contours, -1, Scalar(255), 2);
imshow("contours", img);
waitKey(0);
return 0;
}
```
在这个例子中,我们首先读入一张灰度图像,然后对其进行二值化处理。接着使用 findContours 函数找到图像中的轮廓,并将其存储在 contours 向量中。最后使用 drawContours 函数将轮廓绘制在原图上。
相关问题
用c++ opencv实现python的sorted_cnt = sorted(contours, key=cv2.contourArea, reverse = True)
在C++中,可以使用以下代码实现与Python中sorted函数中的key参数类似的功能:
```c++
#include <opencv2/opencv.hpp>
#include <iostream>
#include <vector>
#include <algorithm>
using namespace cv;
using namespace std;
bool compareContourAreas(vector<Point> contour1, vector<Point> contour2) {
double i = fabs(contourArea(Mat(contour1)));
double j = fabs(contourArea(Mat(contour2)));
return (i > j);
}
int main() {
vector<vector<Point>> contours; // 存储轮廓
vector<Vec4i> hierarchy; // 存储轮廓的拓扑结构
Mat image = imread("test.jpg", IMREAD_GRAYSCALE);
findContours(image, contours, hierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point(0, 0));
sort(contours.begin(), contours.end(), compareContourAreas); // 排序
return 0;
}
```
在这个例子中,我们定义了一个名为compareContourAreas的函数,该函数接受两个轮廓作为参数,并返回一个布尔值。在该函数中,我们使用cv::contourArea函数计算每个轮廓的面积,并将它们的绝对值作为比较的依据。
最后,我们使用sort函数对轮廓进行排序,并传递compareContourAreas函数作为参数,以确保按面积大小的倒序排列。
需要注意的是,在C++中,没有直接的reverse参数,我们需要自己实现compareContourAreas函数来实现类似的功能。
C++Qt中如何将vector<vector<Point>> contours的数据仪二进制的形式写入sqlite3数据库,并从数据库中读出来
在C++中,特别是使用Qt库结合SQLite作为数据库,你可以使用`QSqlDatabase`、`QSqlQuery`以及一些容器处理技术来操作这种二维向量的数据结构。首先,你需要包括相关的头文件并创建一个SQLite连接:
```cpp
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QByteArray>
#include <QDataStream>
// 假设Point是一个自定义类,包含x和y坐标
struct Point {
int x;
int y;
};
```
接下来,我们将数据写入数据库:
```cpp
// 定义一个函数用于序列化向量
void serializeContourToBlob(vector<vector<Point>>& contour, QByteArray& blob) {
QDataStream out(&blob, QIODevice::WriteOnly);
for (const auto &row : contour) {
for (const auto &point : row) {
out << point.x << point.y;
}
}
}
// 写入数据库
void saveContoursToSqlite(QSqlDatabase& db, const QString& tableName, vector<vector<Point>>& contours) {
QSqlQuery query(db);
query.prepare("INSERT INTO " + tableName + " (contour_data) VALUES (?)");
QByteArray blob;
serializeContourToBlob(contours, blob);
query.addBindValue(blob);
if (!query.exec()) {
// 处理错误
}
}
```
然后,从数据库读取数据:
```cpp
// 反序列化从数据库获取的数据
vector<vector<Point>> loadContoursFromSqlite(QSqlDatabase& db, const QString& tableName) {
QSqlQuery query(db, "SELECT contour_data FROM " + tableName);
if (!query.exec()) {
// 处理错误
}
while (query.next()) {
QByteArray blob = query.value(0).toByteArray();
QDataStream in(blob, QIODevice::ReadOnly);
QVector<QVector<Point>> contours;
while (!in.atEnd()) {
QVector<Point> contour;
in >> contour; // 解析点
contours.append(contour);
}
return contours;
}
return {}; // 数据不存在或查询结果为空
}
```
阅读全文