Я делаю систему классификации форм и цветов в реальном времени с очень высокой точностью. Кажется, что моя фаза предварительной обработки недостаточно хороша, поэтому результат не такой точный, как я ожидал. Вот что я делаю:
Это моя фаза предварительной обработки:
image_cv = cv::cvarrToMat(image_camera);
Mat cropped = image_cv(cv::Rect(0, 190, 640, 110));
imshow("origin", cropped);
Mat croppedCon = CropConveyor(cropped);
cv::cvtColor(croppedCon, croppedCon, CV_RGB2HSV);
medianBlur(croppedCon, croppedCon, 3);
cv::Mat binRect;
cv::inRange(croppedCon, Scalar(iLowH, iLowS, iLowV), Scalar(iHighH, iHighS, iHighV), binRect);
Это код для обнаружения квадратов:
vector<vector<Point>> contours;
findContours(binarizedIm, contours, CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE);
vector<Point> approx;
for (size_t i = 0; i < contours.size(); i++)
{
//double arclength = arcLength(Mat(contours[i]), true);
approxPolyDP(Mat(contours[i]), approx, 3.245 , true); //0.04 for wood
if (approx.size() != 4) continue;
if (isContourConvex(Mat(approx)) && contourArea(Mat(approx)) > 250)
{
double MaxCos = 0;
for (int j = 2; j < 5; j++)
{
double cos = angle(approx[j % 4], approx[j - 1], approx[j - 2]);
MaxCos = MAX(cos, MaxCos);
}
if (MaxCos < 0.2)
squares.push_back(approx);
}
}
Я думаю, что шум в HSV Image является основной причиной. Вот несколько изображений, иллюстрирующих мои проблемы. Я видел много шума в HSV Image, поэтому я использую медиа-фильтр для него, чтобы уменьшить шум, но сохранить края, потому что я думаю, что информация о краях очень важна при использовании функции findContours.
HSV и HSV в отдельных каналах
Мой вопрос:
Причиной шума в вашем изображении насыщенности является шум во входном изображении. Вызывается плохой камерой / оптикой и еще больше усиливается сжатием JPEG.
Это худшее изображение, которое я видел за последние годы. Вы не должны вкладывать еще одну секунду в обработку этого, если вы не живете на Марсе и не нуждаетесь в результатах завтра.
Ваше входное изображение очень шумное, с низкой частотой дискретизации, расфокусированным, недоэкспонированным, полным артефактов сглаживания и сжатия и почти всем остальным, что вы можете сделать неправильно с изображением.
Первое правило обработки сигналов:
дерьмо = дерьмо
Вы можете получить гораздо лучшие камеры в основном бесплатно. Найдите и используйте один.
Частично проблема заключается в том, что вы делаете шумоподавление в пространстве HSV. В вашем примере вы можете видеть, что V-канал ведет себя лучше, чем H и S. Было бы лучше сделать шумоподавление в RGB (которое является более линейным и ближе, хотя и не идентичным, к собственному цветовому пространству камеры, где шум происходит, конечно, есть и гамма-коррекция).
Может быть, стоит подумать о более сильном, сохраняющем края шумоподавляющем фильтре, таком как Двусторонний фильтр.
Я не понимаю, почему вы используете HSV для сегментирования объектов, изображение RGB достаточно хорошее. Разделите изображение на 3 канала (r, g, b) и примените к ним адаптивный порог. расширить и размять изображения, затем добавить (не объединяя) эти 3 двоичных изображения, чтобы получить одно двоичное изображение. Наконец сделайте уровень 6 вашего рецепта, чтобы извлечь объекты. Если шум все еще влияет на результат, примените двусторонний фильтр к каналам r, g, b до порогового значения.