Я использовал определение canny edge, и я нашел контуры на изображении, которое я пытаюсь обработать. Я хочу найти пять самых больших контуров, а затем посмотреть, есть ли контуры в пяти крупнейших контурах изображения. Возможно ли это? Я новичок в OpenCV.Найти наибольшие контуры OpenCV
0
A
ответ
8
Вы можете найти самые крупные контуры 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;
}
Смежные вопросы
- 1. Android OpenCV Найти контуры
- 2. OpenCV найти контуры закрытых объектов
- 3. Найти контуры в JavaCV или OPENCV
- 4. Python OpenCV сортировки контуры
- 5. Повторяющиеся контуры в opencv
- 6. openCV C++ find Контуры
- 7. Контуры заполнения в opencv
- 8. Контуры разделения OpenCV
- 9. OpenCV «Почти» Закрытые контуры
- 10. Обнаруженные контуры Opencv
- 11. Контуры ограничения OpenCV Java
- 12. Контуры поиска OpenCV
- 13. OpenCV: findContours(): как упорядочиваются контуры?
- 14. Найти наибольшие общие подпоследовательности
- 15. OpenCV (Android) - удалить контуры, нарисованные
- 16. imageSnake function opencv - активные контуры
- 17. Java - OpenCV игнорируя дополнительные контуры
- 18. Вогнутые корпуса/контуры с opencv?
- 19. OpenCV лучший способ рисовать контуры
- 20. Заказ OpenCV контуры в C++
- 21. Извлечь внутренние контуры (ОТВЕРСТИЯ) OpenCV
- 22. Как объединить контуры в OpenCV?
- 23. Как подключить контуры OpenCV горизонтально?
- 24. OpenCV Python: найти контуры/края/прямоугольник в изображении
- 25. Как найти контуры внутри ROI с помощью opencv и Python?
- 26. opencv найти и сохранить внутренние контуры, зная самый большой
- 27. Контуры opencv: Как удалить небольшие контуры в двоичном изображении
- 28. Как отслеживать различные контуры в opencv python
- 29. OpenCV конвертирует концы кантов на контуры
- 30. OpenCV/Python: контуры изображения не отображаются
Вы хотите найти, если есть контуры _inside_ 5 по величине? – Miki
Да. У меня есть фотография из пяти бутылок, и я хочу посмотреть, есть ли на них этикетки. Самые крупные контуры обозначают каждую бутылку, и если у бутылки есть этикетка, внутри нее есть дополнительные контуры. Надеюсь, это имеет смысл. – Boots2014
Ну, да, это имеет смысл. Можете ли вы показать, что вы пробовали до сих пор? – Miki