Интты отображаются в виде двоичных типов данных в двоичных файлах.Как я приведу их к 8-разрядному целому числу без знака перед выводом - PullRequest
0 голосов
/ 01 февраля 2019

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

1 Ответ

0 голосов
/ 01 февраля 2019

Закончилось тем, что не использовал pickle, а вместо этого использовал struct.pack () для приведения к байту следующим образом:

outputFile.write(struct.pack("B", intToCast))

Просто убедитесь, что при открытии файла он снабжен флагом "wb"а не просто "ш"

...