OpenCV C ++: непоследовательное обнаружение хитрых краев под изменяющимся освещением - как улучшить предварительную обраC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 OpenCV C ++: непоследовательное обнаружение хитрых краев под изменяющимся освещением - как улучшить предварительную обра

Сообщение Anonymous »

Я работаю над проектом обнаружения объекта в C ++ с помощью OpenCV. В частности, я захватываю изображение (например, монеты на фоне), а затем пытаюсь обнаружить их с помощью обнаружения хитрых краев и фильтрации контура. Тем не менее, я борюсь с получением постоянных результатов в различных условиях освещения. Я пробовал: < /p>

[*] Различные лампы, фоны и настройки освещения. /li>
Различные затопку, размытие и морфологические операции. < /li>
< /ul>
Это пример:
Original: < бренд /> Original < /p>
после предварительной обработки:
после предварительной обработки: < /p>
После хэпни:
после canny < /p>
Я использую следующие функции для подготовки изображения и обнаружения краев. Я пытался создать трубопровод «все в один», который включает в себя затопку, регулировку яркости/контрастности, размытие, автоматическое или ручное хитрый, дополнительная дилатация и окончательная морфологическая операция.
< P> Несмотря на то, что я могу настроить параметры для одного сценария, результаты часто значительно варьируются при небольшом изменении освещения или движутся объекты. Иногда края выглядят нормально, иногда они сломаны или шумно. < /P>
сокращенная версия моей функции: < /p>
void ObjectFinder::applyEdgeFilter(const cv::Mat& input, cv::Mat& preCanny, cv::Mat& edgeImage) const {
cv::Mat gray;
cv::cvtColor(input, gray, cv::COLOR_BGR2GRAY);
cv::equalizeHist(gray, gray);

cv::Mat sharpened;
if (m_sharpenMode == 1) {
cv::Mat blurredForSharpen;
cv::GaussianBlur(gray, blurredForSharpen, cv::Size(0, 0), 3);
double factor = (m_sharpenStrength / 100.0) - 1.0;
cv::addWeighted(gray, 1 + factor, blurredForSharpen, -factor, 0, sharpened);
} else if (m_sharpenMode == 2) {
cv::medianBlur(gray, sharpened, 3);
} else {
sharpened = gray.clone();
}

double alpha = m_contrastValue / 100.0;
int beta = m_brightnessValue - 100;
cv::Mat brightContrastAdjusted;
sharpened.convertTo(brightContrastAdjusted, -1, alpha, beta);

double sigmaBlur = (m_blurSigmaValue == 0) ? 0.1 : m_blurSigmaValue / 10.0;
cv::GaussianBlur(brightContrastAdjusted, preCanny, cv::Size(0, 0), sigmaBlur, sigmaBlur);

if (m_autoCannyMode == 1) {
double med = computeMedian(preCanny);
double sigmaAuto = m_sigmaValue / 100.0;
int lower = std::max(0, int((1.0 - sigmaAuto) * med));
int upper = std::min(255, int((1.0 + sigmaAuto) * med));
cv::Canny(preCanny, edgeImage, lower, upper);
} else {
cv::Canny(preCanny, edgeImage, m_lowThreshold, m_highThreshold);
}

if (m_showDilation == 1) {
cv::dilate(edgeImage, edgeImage, cv::getStructuringElement(cv::MORPH_RECT, cv::Size(3, 3)));
}

cv::Mat morphKernel = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(5, 5));
cv::morphologyEx(edgeImage, edgeImage, cv::MORPH_CLOSE, morphKernel);
}
< /code>
Вопросы < /strong> < /p>

Я делаю какие -либо концептуальные ошибки в моем трубопроводе предварительной обработки (Sharen → Яркость/контраст → Blur → Canny → Необязательное дилатация → морфология)?
Есть ли более надежные подходы (например, адаптивное порог, освещение Нормализация, другие фильтры) для достижения стабильного обнаружения краев и распознавания контур?
различные морфологические операции
разные затопки /размытые фильтры (гауссовая, медианная, двусторонняя)
Регулирующие параметры на лету с Trackbars
Несмотря на эти попытки, края иногда выглядят великолепно, а в других случаях слишком шумные или сломанные. < /p>

Подробнее здесь: https://stackoverflow.com/questions/794 ... -how-to-im
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»