将网络摄像头图像转换为cmd中的ASCII的Python脚本,不会打印Unicode

时间:2019-03-20 01:48:52

标签: python unicode

我找到了这个python脚本,它将网络摄像头输入转换为ASCII到命令行,并进行了一些更改以满足我的需要。我想在输出中添加一个Unicode字符,但是,每当我实际运行它时,它仅会打印出一个框,而不是正确的Unicode。我需要更改什么以确保它能输出实际的Unicode字符?

import cv2
from time import sleep, time
import sys

import curses
from curses import wrapper

import locale
locale.setlocale(locale.LC_ALL, '')
#stdscr.addstr(0, 0, mystring.encode('UTF-8'))

x = 160
sx = 4

chars = ['\u23FA', ".", ".", "  ", "  ", "  ", "  ", "  ", "  ", "  "]

size = x*sx, int(x*sx*.75)
operating = False
ongoing = True
#font.set_bold(True)
fpsa = 0

br = (255, 255, 255)
fr = (0, 0, 0)

lenc = len(chars)

visload = False
mt = False
aa = False

def toAscii(pic, scr):
    global operating
    m = 0
    for y in pic:
        tm = max(y)
        if tm > m:
            m = tm

    fx = 0
    fy = 0

    h,w = scr.getmaxyx()

    #for y in pic:
        #for x in y:
    for _y in range(h-1):
        for _x in range(w-1):
            y = pic[int(_y/float(h) * len(pic))]
            x = y[int(_x/float(w) * len(y))]
            scr.addstr(_y, _x, chars[int(x/m*(lenc-1))].encode('UTF-8'), curses.color_pair(1))
            fx += 1
        fy += 1
        fx = 0
    operating = False


cap = cv2.VideoCapture(0)

def main(scr):

    global operating

    while True:
        ret, frame = cap.read()

        curses.init_pair(1, curses.COLOR_WHITE, curses.COLOR_BLACK)

        colored = cv2.resize(cv2.resize(cv2.cvtColor(frame, 0), (x, int(x*0.75))), (640, 480))
        colored = cv2.cvtColor(frame, 0)


        gray = cv2.resize(cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY), (x, int(x*.75)))

        if not operating:
            operating = True
            if mt:
                _thread.start_new_thread(toAscii, (gray, scr))
            else:
                toAscii(gray, scr)

        scr.refresh()


        #gray = cv2.resize(gray, (640, 480), interpolation = cv2.INTER_NEAREST)


        #cv2.imshow('frame',cv2.resize(gray, (640, 480)))

def _main(scr):
    try:
        main(scr)
    except KeyboardInterrupt:
        pass

wrapper(_main)

cap.release()
cv2.destroyAllWindows()

1 个答案:

答案 0 :(得分:0)

这取决于您使用的终端仿真器。表情符号字符在终端中显示为框的原因是终端仿真器不支持Unicode字符。

我刚刚在iTerm2上测试了您的代码,该代码支持Unicode,并且可以正常工作。