Сопоставление шаблонов сContours в Python3 OpenCV на Jetson Nano

Вопрос или проблема

У меня проблема с получением результата от сопоставления шаблона с контуром с помощью 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, похоже, он не дает ожидаемых результатов. Давайте обсудим возможные причины этого и предлагаю несколько рекомендаций.

Возможные причины проблемы:

  1. Производительность Jetson Nano:
    Jetson Nano имеет ограниченные вычислительные ресурсы по сравнению с современными ПК. Это может привести к задержкам в обработке изображения, что, в свою очередь, может повлиять на качество захвата и распознавания контуров. Обработка изображений в режиме реального времени на Jetson может быть более требовательной, особенно при использовании камер с низким качеством.

  2. Качество захвата изображения:
    Проверьте, как камера захватывает изображение на Jetson Nano. Убедитесь, что резкость, яркость и контрастность захваченного изображения достаточно хороши для выполнения дальнейших шагов обработки. Возможно, вам потребуется провести предварительную обработку изображений, чтобы улучшить их качество.

  3. Параметры обработки изображений:
    Попробуйте изменить параметры для функции cv2.threshold() и другие параметры обработки изображений, такие как методы обнаружения контуров. Настройка этих параметров может значительно улучшить результаты сопоставления. Например, также можно использовать более адаптивные техники пороговой обработки, такие как cv2.adaptiveThreshold.

  4. Нормализация и подготовка изображений:
    Убедитесь, что ваши изображения нормализованы и имеют одинаковые размеры. Если размеры шаблона и целевого изображения различаются, это может помешать корректному сопоставлению. Вы можете использовать cv2.resize для изменения размера изображения.

  5. Изменение метода сопоставления:
    Вы используете метод 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

Оцените материал
Добавить комментарий

Капча загружается...