Я хочу использовать значение, возвращаемое ползунком, в качестве индекса строки в массиве Numpy.

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

Я пытаюсь дублировать код, который был использован на следующем изображении:запись профиля в реальном времени

Идея заключается в том, чтобы использовать камеру Pi и cv2 для записи спектра, а затем использовать ползунок для нахождения строки, для которой генерируется профиль

Вот мой код на данный момент. Я не могу получить значение y в местоположение строки массива для отображения. Установка row = y не работает. Спасибо за предложения.

`

import cv2
from picamera2 import Picamera2
import matplotlib.pyplot as plt
import numpy as np
import time

picam2 = Picamera2()
dispW=1280
dispH=720
picam2.preview_configuration.main.size = (dispW,dispH)
picam2.preview_configuration.main.format = "RGB888"
picam2.preview_configuration.controls.FrameRate=30
picam2.preview_configuration.align()
picam2.configure("preview")
picam2.start()

def on_trackbar(val):
    global y
    y=val
    
cv2.namedWindow('Камера')

y=0
row=0
cv2.createTrackbar('Y','Камера',y,dispW-1,on_trackbar)

plt.ion()
fig = plt.figure()
ax = fig.add_subplot(111)

while True:
    
    im= picam2.capture_array()
     
    cv2.line(im,(0,y),(im.shape[1],y),(0,255,0),2)
    cv2.imshow('Камера', im)
    
    row=y
    print(row)
    data=im[row,:,2]
   
    ax.set_xlim(0,1279)
    ax.set_ylim(0,255)
    
    line1 = ax.plot(data)
    fig.canvas.draw()
    fig.canvas.flush_events()
    
    plt.cla()     # очищает предыдущие данные
    time.sleep(0.2)     
    if cv2.waitKey(1)==ord('q'):
        break
cv2.destroyAllWindows()

Ответ или решение

Вопрос о том, как использовать значение, возвращаемое ползунком (trackbar), в качестве индекса строки для массива NumPy, является распространенной задачей в области компьютерного зрения. В данном случае требуется интегрировать функциональность трекбара, чтобы визуализировать конкретную строку данных, получаемую с помощью камеры Raspberry Pi, с использованием библиотеки OpenCV.

Контекст задачи

Вы находитесь на этапе разработки кода, который использует камеру Pi для захвата изображения спектра и реализует интерфейс с ползунком, позволяющий пользователю выбирать определённую строку изображения для дальнейшей визуализации. Ваша цель — корректно получать значение, выбранное ползунком, и использовать его как индекс для извлечения данных из захваченного изображения.

Исходный код и текущие проблемы

Ваша текущая реализация имеет простую структуру:

  1. Инициализация камеры и настройка формы окна.
  2. Создание трекбара для управления индексом строки.
  3. Захват изображения и отображение линии на выбранной строке.
  4. Попытка извлечь данные из конкретной строки изображения для построения графика.

Однако, основная трудность заключается в понимании того, что нужно правильно использовать индекс строки, получаемый через ползунок, для извлечения соответствующих данных из массива im.

Исправление и улучшение кода

Чтобы улучшить ваш код и сделать его более эффективным, следует внести несколько изменений. В частности, вам нужно убедиться в правильной работе с границами массива и в точности извлечения данных. Вот исправленный вариант вашего кода:

import cv2
from picamera2 import Picamera2
import matplotlib.pyplot as plt
import numpy as np
import time

picam2 = Picamera2()
dispW = 1280
dispH = 720
picam2.preview_configuration.main.size = (dispW, dispH)
picam2.preview_configuration.main.format = "RGB888"
picam2.preview_configuration.controls.FrameRate = 30
picam2.preview_configuration.align()
picam2.configure("preview")
picam2.start()

# Функция обратного вызова для трекбара
def on_trackbar(val):
    global y
    y = val

cv2.namedWindow('Camera')

y = 0
cv2.createTrackbar('Y', 'Camera', y, dispH - 1, on_trackbar)  # Изменен max на dispH - 1

plt.ion()
fig = plt.figure()
ax = fig.add_subplot(111)

while True:
    im = picam2.capture_array()

    # Отображение линии на выбранной строке
    cv2.line(im, (0, y), (im.shape[1], y), (0, 255, 0), 2)
    cv2.imshow('Camera', im)

    # Используйте y как индекс для извлечения данных
    if 0 <= y < im.shape[0]:  # Убедитесь, что y в границах массива
        data = im[y, :, 2]  # Извлекаем значение по каналу красного цвета

        # Настройка графика
        ax.set_xlim(0, dispW - 1)
        ax.set_ylim(0, 255)

        ax.clear()  # Очистка предыдущих данных перед обновлением
        ax.plot(data)  # Построение графика для данных
        fig.canvas.draw()
        fig.canvas.flush_events()

    time.sleep(0.2)  # Задержка для контроля частоты обновления
    if cv2.waitKey(1) == ord('q'):  # Прерывание при нажатии 'q'
        break

cv2.destroyAllWindows()

Объяснение доработок

  1. Границы трекбара: Убедитесь, что максимальное значение в cv2.createTrackbar соответствует высоте изображения (dispH – 1).

  2. Проверка индекса: Перед доступом к данным по индексу y добавлена проверка на границы массива, чтобы избежать ошибок "index out of bounds".

  3. Очистка графика: Использование ax.clear() вместо plt.cla() для улучшения читаемости кода.

Заключение

С помощью этих исправлений вы сможете эффективно использовать значение, возвращаемое ползунком, в качестве индекса строки в массиве NumPy, что позволит вам визуализировать и анализировать данные на более высоком уровне. Данная информация может быть использована для реализации различных приложений в области компьютерного зрения, и является важным шагом в развитии ваших навыков программирования.

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

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