gpt4 book ai didi

c++ - 使用鼠标手动提取对象

转载 作者:太空宇宙 更新时间:2023-11-03 22:14:30 24 4
gpt4 key购买 nike

我目前正在开始学习 OpenCV,我有一个问题:

有没有一种使用鼠标手动从图像中提取对象的简单方法?我想在对象周围画一个多边形,最后把它剪掉。

因为我才刚刚开始,所以我不知道该怎么做。我已经检查了“Grabcut”示例以了解使用矩形来选择子图像的想法,但这并不是我要找的。

任何帮助将不胜感激! :-)

谢谢,远见

最佳答案

首先选择多边形使用setMouseCallback每次用户点击图片时都会得到回调。将每个单击的点添加到多边形点列表中。要可视化到目前为止的点,您可以使用 drawing functions in OpenCV .还有一些关于如何使用 setMouseCallback here 的示例代码.例如,您可以让用户选择点,直到他按下按钮或使用右键单击最后一个点以完成选择。

要使用生成的多边形,请查看教程 here .此外,在此之后您还可以使用 boundingRect在多边形周围裁剪图像。

编辑:刚刚意识到使用 fillPoly 可能更聪明创建面具。

vector<vector<cv::Point> > polygons; // draw function takes list of polygons
cv::Mat mask = cv::Mat::zeros(height, width, CV_8UC3);
cv::fillPoly(mask, polygons, cv::Scalar(255, 255, 255));

上面的代码似乎没有记录(但它至少在旧版本的 Opencv 2.3.1 中有效)。另一种方法是这样的:

cv::Mat mask = cv::Mat::zeros(height, width, CV_8UC3); // Image
vector<vector<cv::Point> > polygons; // draw function takes list of polygons
vector<int> polygonSizes;
vector<cv::Point*> polygonPointers;
for (int i=0; i<polygons.size(); i++) {
polygonSizes.push_back(polygons[i].size());
polygonPointers.push_back(&polygons[i][0]);
}
cv::fillPoly(mask, (const cv::Point**) &polygonPointers[0], &polygonSizes[0], (int)polygons.size(), cv::Scalar(255, 255, 255));

关于c++ - 使用鼠标手动提取对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19754259/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com