Я пишу сценарий, который берет список пикселей из видео и генерирует двоичный файл, где каждый выбранный пиксель представлен своим индексом и соответствующими значениями rgb.Проблема, с которой я столкнулся, заключается в том, что значения RGB, генерируемые opencv, имеют какой-то конкретный тип данных numpy, и я хотел бы привести все значения в файле к 8-разрядным целым числам без знака, чтобы минимизировать размер файла и объем данных, которыепозже потребуется отправка по последовательному соединению для отображения на полосе RGB Neopixel.
Я не женат на использовании pickle для вывода, все, что мне нужно, - это двоичный файл, который я могу подготовить в байтах за байтом и отправитьчерез последовательное соединение.
import numpy as np
import cv2
import sys
import pickle
# Help and args check
if((len(sys.argv) < 4) or (sys.argv[0] == "help")):
print("This application requires 3 arguments in the following order:\n"
+ "inputVideoFile inputPixelList outputNeoPixelStream\n\n"
+ "View the README for informantion on supported formats for input files")
exit()
# load file I/O
cap = cv2.VideoCapture(str(sys.argv[1]))
pixelFile = open(sys.argv[2], "r")
pixelStream = open(sys.argv[3], "wb")
# load pixels into 2d array
pixels = []
lines = pixelFile.readlines()
for line in lines:
pixel = line.strip().replace(" ", "").split(",")
pixel[0] = int(pixel[0])
pixel[1] = int(pixel[1])
pixels.append(pixel)
print(pixels)
#set start frame count
frameCount = 0
#set start frame
ret, frame = cap.read()
pixeldelimiter = 1
# Analyze all the video frames
while(frame is not None):
frameCount+=1
# Print RGB colors for each pixel that
for index, pixel in enumerate(pixels):
# opencv pixel format is y, x, c where c is the color in order b g r
r = frame[pixel[1], pixel[0], 2]
g = frame[pixel[1], pixel[0], 1]
b = frame[pixel[1], pixel[0], 0]
if (r == 1): r = 0
if (g == 1): g = 0
if (b == 1): b = 0
pickle.dump(pixeldelimiter, pixelStream)
pickle.dump(index, pixelStream)
pickle.dump(r, pixelStream)
pickle.dump(g, pixelStream)
pickle.dump(b, pixelStream)
#display the current frame (useful for converting long animations)
cv2.imshow('frame',frame)
#load next frame
ret, frame = cap.read()
cap.release()
pixelStream.close()