Я пытаюсь определить поле, похожее на символ, и постобработанное изображение выглядит так.
Я пытался использовать морфологическую операцию, чтобы попытаться сократить разрыв, но разрыв кажется слишком большим
cv::Mat element = cv::getStructuringElement(cv::MORPH_ELLIPSE, cv::Size(5,5));
cv::morphologyEx(frame, frame, cv::MORPH_DILATE, element);
cv::morphologyEx(frame, frame, cv::MORPH_ERODE, element);
После использования findcontour картинка выглядит следующим образом
std::vector<std::vector<cv::Point> > contours;
std::vector< cv::Vec4i > hierarchy;
cv::findContours(frame, contours, hierarchy, cv::RETR_CCOMP, cv::CHAIN_APPROX_SIMPLE);
Не совсем неожиданно здесь, поскольку есть несколько пробелов, которые не являются близкими. Когда я пытаюсь приближение к apolipDP, контур при проверке вершин = 4 и проверка функции isContourConvex завершается неудачей ... (опять же, в некотором ожидании)
Я мог использовать minRectArea только для того, чтобы весь контур был прямоугольником.
tempCandidate.push_back(cv::minAreaRect(cv::Mat(contours[i])));
Кажется, это работает для этого примера, но у меня есть более шумное изображение для обработки.
- Какую еще стратегию предварительной обработки я могу использовать, чтобы закрыть границу?
как я могу убедиться, что область, которую я заключаю с помощью miniRectArea, является прямоугольником? Я проверяю, используя длину контура, отвечающую минимальным требованиям, и RotatedRect должен иметь определенные углы, дыхание и ширину
Правильно ли я использую findContour?
PS: я не знаю, составляет ли пост один слишком много вопросов. Если это произойдет, я разделю вопросы на несколько постов.
Заранее спасибо