#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;
}