Я пытаюсь локализовать ЖК-дисплей в наборе изображений, но в данный момент застрял в определенной точке процесса. Это двоичное изображение области интереса, как мне извлечь из нее внутренний прямоугольник или координаты внутреннего угла границ.
Я попробовал следующее,
Найдите края на изображении, используя Canny()
, используйте findContours()
, чтобы найти контуры. Из списка контуров я сталкиваюсь с двумя проблемами,
- Какой контур выбрать?
- Из этого изображения я получил более 10 контуров, и только внешний прямоугольник является полным прямоугольником. Остальные все контуры представляют собой непересекающиеся линии, которые вместе образуют внутренний прямоугольник
Это мой код,
// threshold
Mat im1_thresh;
threshold(im1, im1_thresh, 100, 200, THRESH_BINARY);
// find edges
Mat im1_canny;
Canny(im1_thresh, im1_canny, 50, 100);
// find contours
vector<vector<Point> > contours;
vector<Vec4i> hierarchy;
findContours(im1_canny, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0));
// draw contours
RNG rng;
vector<Rect> boundRect(contours.size());
Mat im1_contours = Mat::zeros(im1_thresh.size(), CV_8UC3);
for (int i = 0; i < contours.size(); i++) {
// draw each contour in a different color
Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255));
drawContours(im1_contours, contours, i, color, 2, 8, hierarchy, 0, Point());
// draw bounding boxes around each contour in original image
boundRect[i] = boundingRect(Mat(contours[i]));
rectangle(im1, boundRect[i].tl(), boundRect[i].br(), color, 2, 8, 0);
}
Вопрос : Как локализовать внутренний прямоугольник из указанного выше двоичного изображения?