Как я могу заполнить область между 2 строками в OpenCV c ?

#c #opencv

Вопрос:

У меня есть это изображение с 2 кривыми: изображение

Как я мог бы заполнить область между красной и синей кривой?

Комментарии:

1. вам нужны эти линии в виде списков точек. если у вас этого еще нет, найдите nondNonZero, но убедитесь, что порядок пунктов является разумным. вы могли бы применить выпуклую оболочку. если ваши линии не прямые, выпуклая оболочка (по набору точек с обеих линий) может и даст вам глупый результат. лучше всего получить каждую линию в виде правильно упорядоченного списка точек, затем сшить обе линии вместе в правильном порядке, т. е. Объединить. так будет лучше.

2. пожалуйста, предоставьте списки точек для обеих линий или объясните, как еще были созданы линии

Ответ №1:

Вот простой способ и код, как вы можете его получить:

  • Проверяйте каждую строку пиксель за пикселем
  • Если вы встретите значения индекса не черного пикселя 2 раза, сохраните эти точки
  • Заполните между этими 2 точками желаемым цветом

Вот выходные данные и код:

Выход:

введите описание изображения здесь

Код:

 #include <iostream>
#include <opencv2/highgui.hpp>


int main()
{

    cv::Mat img = cv::imread("/ur/img/dir/images.png");

    for(int i=0; i<img.rows; i  )
    {
        bool started = 0;
        int startX = 0, stopX = 0;
        for(int j=0; j<img.cols; j  )
        {


                if(img.at<cv::Vec3b>(cv::Point(j,i))[0] != 0)
                {
                    started = 1;

                    if(startX)
                        stopX = j;

                }
                else if(started)
                {
                    if(startX == 0)
                    startX = j;

                    started = 0;
                }



        }

        if(startX amp;amp; stopX)
        {
            for(int k=startX; k<stopX; k  )
            {
                img.at<cv::Vec3b>(cv::Point(k,i))[0] = 0;
                img.at<cv::Vec3b>(cv::Point(k,i))[1] = 255;
                img.at<cv::Vec3b>(cv::Point(k,i))[2] = 255;

            }
        }
    }

    cv::imshow("Test",img);
    cv::waitKey(0);


    return 0;
}