Boo*_*014 1 c++ opencv computer-vision
我使用了canny边缘检测,我在我试图处理的图像上找到了轮廓.我想找到五个最大的轮廓,然后看看图像中五个最大轮廓内是否有轮廓.这可能吗?我是OpenCV的新手.
Mik*_*iki 10
您可以找到N
检查其长度的最大轮廓.您应该注意传递findContours
参数CHAIN_APPROX_NONE
以使其正常工作.
然后,如果有其他轮廓,您可以检查每个面罩内部.
图片:
N = 5
最大的轮廓,每个轮廓都有内轮廓.
码:
#include <opencv2\opencv.hpp>
#include <vector>
#include <numeric>
using namespace cv;
using namespace std;
int main()
{
Mat3b img = imread("path_to_image");
Mat1b gray;
cvtColor(img, gray, COLOR_BGR2GRAY);
Mat1b edges;
Canny(gray, edges, 200, 50);
vector<vector<Point>> contours;
findContours(edges.clone(), contours, RETR_EXTERNAL, CHAIN_APPROX_NONE);
vector<int> indices(contours.size());
iota(indices.begin(), indices.end(), 0);
sort(indices.begin(), indices.end(), [&contours](int lhs, int rhs) {
return contours[lhs].size() > contours[rhs].size();
});
int N = 5; // set number of largest contours
N = min(N, int(contours.size()));
Mat3b res = img.clone();
// Draw N largest contours
for (int i = 0; i < N; ++i)
{
Scalar color(rand() & 255, rand() & 255, rand() & 255);
Vec3b otherColor(color[2], color[0], color[1]);
drawContours(res, contours, indices[i], color, CV_FILLED);
// Create a mask for the contour
Mat1b res_mask(img.rows, img.cols, uchar(0));
drawContours(res_mask, contours, indices[i], Scalar(255), CV_FILLED);
// AND with edges
res_mask &= edges;
// remove larger contours
drawContours(res_mask, contours, indices[i], Scalar(0), 2);
for (int r = 0; r < img.rows; ++r)
{
for (int c = 0; c < img.cols; ++c)
{
if (res_mask(r, c))
{
res(r,c) = otherColor;
}
}
}
}
imshow("Image", img);
imshow("N largest contours", res);
waitKey();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
6071 次 |
最近记录: |