Вопрос или проблема
У меня проблема с получением результата от сопоставления шаблона с контуром с помощью OpenCV на Jetson Nano En715. Указанный ниже код работает идеально на ПК (Windows и Linux) без каких-либо задержек или лагов, но когда я запускаю его на Jetson Nano En715 с USB-камерой Logitech C270 (эта камера такая же, как та, что я использую на ПК), я не могу сопоставить шаблон. Нет ошибки, просто шаблон и изображение не совпадают. Может кто-нибудь помочь мне понять, в чем проблема? Возможно, это из-за моего кода или, возможно, Jetson Nano En715 слишком слаб для этого и имеет лаги. Спасибо, ребята.
import cv2
import numpy as np
import matplotlib.pyplot as plt
from math import copysign, log10
MatchImage = False
vc = cv2.VideoCapture(0)
template = cv2.imread('template.jpg')
template_img = template
plt.axis('off')
plt.imshow(template)
plt.title('НАШ ШАБЛОН')
plt.show()
template = cv2.cvtColor(template,cv2.COLOR_BGR2GRAY)
_, target = vc.read()
img_copy=target.copy()
target_gray = cv2.cvtColor(target,cv2.COLOR_BGR2GRAY)
plt.axis('off')
plt.imshow(target)
plt.title('НАША ЦЕЛЬ')
plt.show()
ret,thresh1 = cv2.threshold(template,127,255,0)
ret,thresh2 = cv2.threshold(target_gray,127,255,0)
contours,hierarchy = cv2.findContours(thresh1,cv2.RETR_CCOMP, cv2.CHAIN_APPROX_NONE)
if hierarchy[0][0][3] == -1 :
cv2.drawContours(template_img,contours,-1,(0,255,0),3)
else:
cv2.drawContours(template_img,contours,-1,(0,0,255),3)
plt.axis('off')
plt.imshow(template_img)
plt.title('Идентификация контуров')
plt.show()
sorted_contours = sorted(contours, key=cv2.contourArea, reverse=True)
template_contour = contours[1]
contours,hierarchy = cv2.findContours(thresh2,cv2.RETR_CCOMP,cv2.CHAIN_APPROX_SIMPLE)
for c in contours:
match = cv2.matchShapes(template_contour,c,3,0.0)
print(match)
if match < 0.15:
closest_contour = c
area = cv2.contourArea(c)
printtext="data print: " + str(area)
print(printtext)
if (match < 0.01):
cv2.drawContours(target,[closest_contour],-1,(255,0,0),3)
c = max([closest_contour], key = cv2.contourArea)
x,y,w,h = cv2.boundingRect(c)
cv2.rectangle(target, (x,y), (x+w,y+h), (0,255,0), 5)
print("Совпадение")
MatchImage = True
plt.title("Оригинальное изображение с ограничивающей рамкой")
plt.imshow(target)
plt.show()
if MatchImage == False:
print("не совпадает")
plt.title("Оригинальное изображение с ограничивающей рамкой")
plt.imshow(target)
plt.show()
if MatchImage == True:
plt.title("Оригинальное изображение с ограничивающей рамкой")
plt.imshow(target)
plt.show()
Ответ или решение
Ответ на вопрос о сопоставлении шаблонов с помощью контуров на Jetson Nano
Уважаемый пользователь,
Я понимаю, что у вас возникают сложности с выполнением алгоритма сопоставления шаблонов на Jetson Nano с использованием OpenCV. Ваш код работает без проблем на ПК, но, увы, на Jetson Nano, похоже, он не дает ожидаемых результатов. Давайте обсудим возможные причины этого и предлагаю несколько рекомендаций.
Возможные причины проблемы:
-
Производительность Jetson Nano:
Jetson Nano имеет ограниченные вычислительные ресурсы по сравнению с современными ПК. Это может привести к задержкам в обработке изображения, что, в свою очередь, может повлиять на качество захвата и распознавания контуров. Обработка изображений в режиме реального времени на Jetson может быть более требовательной, особенно при использовании камер с низким качеством. -
Качество захвата изображения:
Проверьте, как камера захватывает изображение на Jetson Nano. Убедитесь, что резкость, яркость и контрастность захваченного изображения достаточно хороши для выполнения дальнейших шагов обработки. Возможно, вам потребуется провести предварительную обработку изображений, чтобы улучшить их качество. -
Параметры обработки изображений:
Попробуйте изменить параметры для функцииcv2.threshold()
и другие параметры обработки изображений, такие как методы обнаружения контуров. Настройка этих параметров может значительно улучшить результаты сопоставления. Например, также можно использовать более адаптивные техники пороговой обработки, такие какcv2.adaptiveThreshold
. -
Нормализация и подготовка изображений:
Убедитесь, что ваши изображения нормализованы и имеют одинаковые размеры. Если размеры шаблона и целевого изображения различаются, это может помешать корректному сопоставлению. Вы можете использоватьcv2.resize
для изменения размера изображения. -
Изменение метода сопоставления:
Вы используете методcv2.matchShapes()
, который может быть чувствительным к различиям в масштабе и ориентации контуров. Рассмотрите возможность использования других методов сопоставления, например, методов на основе признаков, таких как SIFT или ORB.
Пример модификации кода:
Вот несколько изменений, которые могут помочь улучшить вашу реализацию:
# Изменены параметры обработки изображений
# Применение GaussianBlur для снижения шума
target_gray = cv2.GaussianBlur(target_gray, (5, 5), 0)
template = cv2.GaussianBlur(template, (5, 5), 0)
# Используйте адаптивный порог
thresh1 = cv2.adaptiveThreshold(template, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
cv2.THRESH_BINARY, 11, 2)
thresh2 = cv2.adaptiveThreshold(target_gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
cv2.THRESH_BINARY, 11, 2)
# Обновление методов сопоставления контуров
for c in contours:
match = cv2.matchShapes(template_contour, c, cv2.CONTOURS_MATCH_I1, 0.0)
if match < 0.15:
# получили совпадение
Заключение
Если все вышеперечисленные действия не приводят к желаемым результатам, возможно, вам стоит попробовать уменьшить нагрузку на процессор, убрав ненужные операции или оптимизировав код. Также учтите, что другие версии OpenCV могут иметь различия в производительности и точности, особенно на встроенных системах.
Если у вас останутся вопросы или потребуется дополнительная помощь, пожалуйста, не стесняйтесь обращаться.
С уважением,
[Ваше имя]
Эксперт в области обработки изображений и OpenCV