Я работаю над проектом, где мне нужно измерить уровень воды с помощью белой измерительной доски. В настоящее время мой подход:
Но я застреваю в сегментации измерительной доски. Я избегаю использования цветовой сегментации, поскольку мне нужно, чтобы она была инвариантной к изменениям освещения, поэтому вместо этого я определяю края с помощью морфологических операций. У меня есть это изображение:
Результат от морфологических операций кажется многообещающим. Края на белой доске датчика острее, чем другие. Но я до сих пор не представляю, как правильно разделить доску. Можете ли вы предложить алгоритм сегментации платы? Или, пожалуйста, предложите, если у вас есть другой алгоритм для измерения уровня воды.
Вот мой код:
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
int main()
{
cv::Mat src = cv::imread("image.jpg");
if (!src.data)
return -1;
cv::Mat bw;
cv::cvtColor(src, bw, CV_BGR2GRAY);
cv::medianBlur(bw, bw, 3);
cv::Mat dilated, eroded;
cv::dilate(bw, dilated, cv::Mat());
cv::erode(bw, eroded, cv::Mat());
bw = dilated - eroded;
cv::imshow("src", src);
cv::imshow("bw", bw);
cv::waitKey();
return 0;
}
Я использую C ++, но я открыт для других реализаций в Matlab / Mathematica.
Если камера действительно неподвижна, вы можете использовать этот тип быстрого и грязного подхода:
im= rgb2gray(imread('img.jpg'));
imr=imrotate(im,1);
a=imr(100:342,150);
plot(a)
Минимальные значения, отображаемые на графике, составляют от 10 (слева) до 1 (справа) по шкале индикатора. Вы можете использовать пиковый детектор, чтобы определить их положение и интерполировать уровень воды между ними.
Таким образом, нет никакой необходимости в причудливой обработке изображений …
Почему вы все-таки сегментируете измерительную доску? Вы просто хотите найти это на картинке, вот и все. Вам не нужно находить относительное расположение сегментов. 5 всегда будет между 4 и 6.
Как вы, вероятно, заметили, вы можете найти приблизительное расположение измерительной доски, отыскивая область с высоким уровнем контрастности. С помощью matchTemplate
Вы можете найти точное местоположение. (Учитывая, что камера исправлена, вы можете пропустить первый шаг и вызвать matchTemplate
напрямую).