Я работаю над проектом обнаружения объекта в 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
OpenCV C ++: непоследовательное обнаружение хитрых краев под изменяющимся освещением - как улучшить предварительную обра ⇐ C++
Программы на C++. Форум разработчиков
1740500097
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>
Подробнее здесь: [url]https://stackoverflow.com/questions/79467189/opencv-c-inconsistent-canny-edge-detection-under-varying-lighting-how-to-im[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия