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

Я работаю над проектом, где мне нужно измерить уровень воды с помощью белой измерительной доски. В настоящее время мой подход:

  1. сегментирование белой калибровочной доски.
  2. измерьте уровень воды по измерительной доске.

Но я застреваю в сегментации измерительной доски. Я избегаю использования цветовой сегментации, поскольку мне нужно, чтобы она была инвариантной к изменениям освещения, поэтому вместо этого я определяю края с помощью морфологических операций. У меня есть это изображение:

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

Результат от морфологических операций кажется многообещающим. Края на белой доске датчика острее, чем другие. Но я до сих пор не представляю, как правильно разделить доску. Можете ли вы предложить алгоритм сегментации платы? Или, пожалуйста, предложите, если у вас есть другой алгоритм для измерения уровня воды.

Вот мой код:

#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.

4

Решение

Если камера действительно неподвижна, вы можете использовать этот тип быстрого и грязного подхода:

im= rgb2gray(imread('img.jpg'));
imr=imrotate(im,1);
a=imr(100:342,150);
plot(a)

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

Минимальные значения, отображаемые на графике, составляют от 10 (слева) до 1 (справа) по шкале индикатора. Вы можете использовать пиковый детектор, чтобы определить их положение и интерполировать уровень воды между ними.
Таким образом, нет никакой необходимости в причудливой обработке изображений …

0

Другие решения

Почему вы все-таки сегментируете измерительную доску? Вы просто хотите найти это на картинке, вот и все. Вам не нужно находить относительное расположение сегментов. 5 всегда будет между 4 и 6.

Как вы, вероятно, заметили, вы можете найти приблизительное расположение измерительной доски, отыскивая область с высоким уровнем контрастности. С помощью matchTemplate Вы можете найти точное местоположение. (Учитывая, что камера исправлена, вы можете пропустить первый шаг и вызвать matchTemplate напрямую).

0

По вопросам рекламы [email protected]