Вопрос или проблема
Я пытаюсь дублировать код, который был использован на следующем изображении:запись профиля в реальном времени
Идея заключается в том, чтобы использовать камеру 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 для захвата изображения спектра и реализует интерфейс с ползунком, позволяющий пользователю выбирать определённую строку изображения для дальнейшей визуализации. Ваша цель — корректно получать значение, выбранное ползунком, и использовать его как индекс для извлечения данных из захваченного изображения.
Исходный код и текущие проблемы
Ваша текущая реализация имеет простую структуру:
- Инициализация камеры и настройка формы окна.
- Создание трекбара для управления индексом строки.
- Захват изображения и отображение линии на выбранной строке.
- Попытка извлечь данные из конкретной строки изображения для построения графика.
Однако, основная трудность заключается в понимании того, что нужно правильно использовать индекс строки, получаемый через ползунок, для извлечения соответствующих данных из массива 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()
Объяснение доработок
-
Границы трекбара: Убедитесь, что максимальное значение в
cv2.createTrackbar
соответствует высоте изображения (dispH – 1). -
Проверка индекса: Перед доступом к данным по индексу y добавлена проверка на границы массива, чтобы избежать ошибок "index out of bounds".
-
Очистка графика: Использование
ax.clear()
вместоplt.cla()
для улучшения читаемости кода.
Заключение
С помощью этих исправлений вы сможете эффективно использовать значение, возвращаемое ползунком, в качестве индекса строки в массиве NumPy, что позволит вам визуализировать и анализировать данные на более высоком уровне. Данная информация может быть использована для реализации различных приложений в области компьютерного зрения, и является важным шагом в развитии ваших навыков программирования.