【发布时间】:2020-09-22 13:44:51
【问题描述】:
我在按颜色过滤某些轮廓时遇到问题。我想删除所有内部有黑色像素的轮廓,只保留带有白色像素的轮廓(见下图)。
创建轮廓列表的代码。我使用了 RETR_TREE 轮廓检索模式和 CHAIN_APPROX_SIMPLE 点选择来避免轮廓内的很多点。
cv::cvtColor(src_img, gray_img, cv::COLOR_BGR2GRAY);
cv::threshold(gray_img, bin_img, minRGB, maxRGB, cv::THRESH_BINARY_INV);
std::vector<std::vector<cv::Point> > contours;
std::vector<cv::Vec4i> hierarchy;
cv::findContours(bin_img, contours, hierarchy, cv::RETR_TREE, cv::CHAIN_APPROX_SIMPLE);
然后,使用这些轮廓,我构建了封闭路径并将它们显示在屏幕上。
输入图像:
当前我的结果:
我需要什么。仅填充具有白色内容的轮廓。
我尝试将所有轮廓缩放到内部 1 个像素,并检查所有像素是否都等于暗,但它并没有像我预期的那样工作。请参阅下面的代码。
double scaleX = (double(src_img.cols) - 2) / double(src_img.cols);
double scaleY = (double(src_img.rows) - 2) / double(src_img.rows);
for (int i = 0; i < contours.size(); i++) {
std::vector<cv::Point> contour = contours[i];
cv::Moments M = cv::moments(contour);
int cx = int(M.m10 / M.m00);
int cy = int(M.m01 / M.m00);
std::vector<cv::Point> scaledContour(contour.size());
for (int j = 0; j < contour.size(); j++) {
cv::Point point = contour[j];
point = cv::Point(point.x - cx, point.y - cy);
point = cv::Point(point.x * scaleX, point.y * scaleY);
point = cv::Point(point.x + cx, point.y + cy);
scaledContour[j] = point;
}
contours[i] = scaledContour;
}
如果您有任何想法或解决方案,我将非常感激,非常感谢!
【问题讨论】:
-
所以您不希望外轮廓适合您拥有的图像?
-
是的,主要思想是去除路径上所有有黑色像素的轮廓。
标签: c++ objective-c opencv drawing contour