как получить матрицу (ROI) в openCV, используя линию, которая наклонена - PullRequest
0 голосов
/ 24 апреля 2018

Я уже пытался найти функцию openCV ROI , но все они использовали функцию roi прямоугольника.

Я хочу получить Рой, используя наклонную линию, полученную из функции hough transform .

Моя ситуация следующая:

У меня есть несколько вертикальных линий (мало наклонных), которые выводятся из функции грубого преобразования.

Я хочу получить изображение (матрицу) между вертикальными линиями. введите описание изображения здесь

я хочу получить разделенную матрицу в моем изображении (например, изображение A, изображение B, изображение C и т. Д.)

Есть ли функция ROI, которая использовала строку в openCV? или же любой другой метод?

1 Ответ

0 голосов
/ 25 апреля 2018

Я думаю, что вам нужно использовать контуры, чтобы определить ваши рои. Если это не идеальный квадрат, вы не можете использовать функцию ROI, потому что это всегда идеальный квадрат (даже не повернутый квадрат)

int main()
{
    enum hierIdx { H_NEXT = 0, H_PREVIOUS, H_FIRST_CHILD, H_PARENT };
    cv::Mat img = cv::imread("example_image.jpg", cv::IMREAD_UNCHANGED);
    // convert RGB to gray scale image
    cv::Mat imgGrs;
    cv::cvtColor(img, imgGrs, cv::COLOR_RGB2GRAY);
    // because it was a .jpg the grey values are messed up
    // we fix it by thresholding at 128
    cv::threshold(imgGrs, imgGrs, 128, 255, cv::THRESH_BINARY);
    imgGrs = ~imgGrs;
    // now create contours (we need the hierarchy to find the inner shapes)
    std::vector<std::vector<cv::Point> > contours;
    std::vector<cv::Vec4i> hierarchy;
    cv::findContours(imgGrs.clone(), contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE);
    //cv::drawContours(img, contours, -1, cv::Scalar(255, 0, 0), 1);

    int iLen = (int)hierarchy.size();
    int idxChild = -1;
    // find first child of master
    for (int i = 0; i < iLen; i++){
        if (hierarchy[i][H_PARENT] < 0) {
            idxChild = hierarchy[i][H_FIRST_CHILD];
            break;
        }
    }

    // used for erosion of mask
    cv::Mat element = cv::getStructuringElement(cv::MORPH_ELLIPSE, cv::Size(3, 3));

    while (idxChild >= 0)
    {
        // create image to use as mask for section
        cv::Mat mask = cv::Mat::zeros(imgGrs.size(), CV_8U);
        cv::drawContours(mask, contours, idxChild, cv::Scalar(255), CV_FILLED);
        // make masker 1 pixel smaller so we wont see the outer contours
        cv::erode(mask, mask, element);
        // ok nu we create a singled out part we want
        cv::Mat part = imgGrs & mask;
        // Crop it to the AOI rectangle
        cv::Rect aoi = cv::boundingRect(contours[idxChild]);
        part = part(aoi);
        // part is now the aoi image you asked for

        // proceed to next AOI
        idxChild = hierarchy[idxChild][H_NEXT];
    }
    return 0;
}
...