【发布时间】:2026-01-12 05:10:02
【问题描述】:
【问题讨论】:
-
Python、C++ 还是 Java?
-
这称为区域填充,如果您使用的是 matlab,那么这可能会对您有所帮助:mathworks.com/matlabcentral/answers/…
标签: opencv
【问题讨论】:
标签: opencv
先找到它的凸包,然后填充它的内部区域:
cv::Mat inputImage = cv::imread("input.jpg", CV_LOAD_IMAGE_GRAYSCALE);
cv::threshold(inputImage, inputImage, 10, 255, 0);
// find non-zero elements
cv::Mat nonZeroCoordinates;
cv::findNonZero(inputImage, nonZeroCoordinates);
cv::vector<cv::Point> points;
for (int i = 0; i < nonZeroCoordinates.total(); i++)
{
points.push_back(nonZeroCoordinates.at<cv::Point>(i));
}
// Find convex hull
std::vector<int> hull;
cv::convexHull(cv::Mat(points), hull, false);
cv::vector<cv::Point> hullpoints;
int hullcount = (int)hull.size();
for (int i = 0; i < hullcount; i++)
{
cv::Point pt = points[hull[i]];
hullpoints.push_back(pt);
}
std::vector<std::vector<cv::Point> > fillContAll;
fillContAll.push_back(hullpoints);
cv::Mat result = cv::Mat::zeros(inputImage.size(), CV_8UC1);
cv::fillPoly(result, fillContAll, cv::Scalar(255));
鉴于您的原始图像:
这是你的最终结果:
【讨论】: