用c++实现上面所说的第二和第三种方法
时间: 2024-04-06 21:29:26 浏览: 91
第二种方法是使用`cv::approxPolyDP`函数对轮廓进行抽稀,以减少重复的点。这可以通过以下代码实现:
```c++
#include <opencv2/opencv.hpp>
using namespace cv;
int main()
{
// 读取图像并转换为灰度图像
Mat img = imread("image.jpg");
Mat gray;
cvtColor(img, gray, COLOR_BGR2GRAY);
// 使用Canny边缘检测算法得到图像边缘
Mat edges;
Canny(gray, edges, 30, 100);
// 使用findContours函数得到轮廓
std::vector<std::vector<Point>> contours;
std::vector<Vec4i> hierarchy;
findContours(edges, contours, hierarchy, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);
// 对每个轮廓进行抽稀
for (auto& contour : contours)
{
double epsilon = 0.01 * arcLength(contour, true);
approxPolyDP(contour, contour, epsilon, true);
drawContours(img, { contour }, 0, Scalar(0, 255, 0), 3);
}
// 显示结果
imshow("image", img);
waitKey(0);
destroyAllWindows();
return 0;
}
```
在上面的代码中,`epsilon`参数是折线与原始轮廓之间的最大距离。较小的值将导致更接近于原始轮廓,但可能会产生更多的点。较大的值将导致更少的点,但可能会导致轮廓形状与原始轮廓有较大的差异。
第三种方法是调整`QGraphicsView`视图的比例和位置,以确保轮廓正确地显示在屏幕上。这可以通过以下代码实现:
```c++
#include <opencv2/opencv.hpp>
#include <QApplication>
#include <QGraphicsView>
#include <QGraphicsScene>
#include <QGraphicsPixmapItem>
using namespace cv;
int main(int argc, char* argv[])
{
// 创建QGraphicsView窗口
QApplication app(argc, argv);
QGraphicsView view;
// 读取图像并转换为灰度图像
Mat img = imread("image.jpg");
Mat gray;
cvtColor(img, gray, COLOR_BGR2GRAY);
// 使用Canny边缘检测算法得到图像边缘
Mat edges;
Canny(gray, edges, 30, 100);
// 使用findContours函数得到轮廓
std::vector<std::vector<Point>> contours;
std::vector<Vec4i> hierarchy;
findContours(edges, contours, hierarchy, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);
// 在QGraphicsView中显示图像和轮廓
QGraphicsScene* scene = new QGraphicsScene();
QPixmap pixmap = QPixmap::fromImage(QImage(img.data, img.cols, img.rows, QImage::Format_RGB888));
QGraphicsPixmapItem* item = new QGraphicsPixmapItem(pixmap);
scene->addItem(item);
for (auto& contour : contours)
{
QPolygonF polygon;
for (auto& point : contour)
{
polygon << QPointF(point.y, point.x);
}
scene->addPolygon(polygon, QPen(Qt::green, 2));
}
// 调整视图的比例和位置
view.setScene(scene);
view.fitInView(item, Qt::KeepAspectRatio);
view.setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
view.setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
// 显示结果
view.show();
app.exec();
return 0;
}
```
在上面的代码中,我们使用`QGraphicsView`和`QGraphicsScene`来显示图像和轮廓。我们还使用`view.fitInView`方法调整视图的比例和位置,以适应图像和轮廓的大小。最后,我们使用`view.setHorizontalScrollBarPolicy`和`view.setVerticalScrollBarPolicy`方法来禁用滚动条,以确保轮廓正确地显示在屏幕上。
阅读全文