我目前正在开始学习 OpenCV,我有一个问题:
有没有一种简单的方法可以使用鼠标手动从图像中提取对象?我想在物体周围画一个多边形,最后把它剪掉。
由于我刚刚开始,我不知道如何做到这一点。我已经检查了“Grabcut”示例以了解有关使用矩形选择子图像的想法,但这并不是我想要的。
任何帮助将不胜感激!:-)
谢谢,visi0nary
首先选择多边形使用setMouseCallback来获取每次用户点击图像时的回调。将每个单击的点添加到多边形点列表中。要可视化到目前为止的点,您可以使用OpenCV 中的绘图功能。这里还有一些关于如何使用 setMouseCallback 的示例代码。例如,您可以让用户选择点,直到他按下按钮或使用右键单击最后一个点来完成选择。
要使用生成的多边形,请查看此处的教程。此外,在此之后,您还可以使用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));