OpenCV FullScreen Window

Python - PythonのOpenCVでフルスクリーン表示|teratail import cv2 cv2.namedWindow('screen', cv2.WINDOW_NORMAL) cv2.setProperty('screen', cv2.WND_PROP_FULLSCREEN, cv2.WINDOW_FULLSCREEN) This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem. python-opencvでQt plugin “cocoa"が見つからないというエラー - Qiita 黒画面 import cv2 import numpy as np # Change here WIDTH = 1920 HEIGHT = 1080 # For secondary monitor, LEFT = 0 TOP = 0 screen = np.zeros((HEIGHT, WIDTH), dtype=np.uint8) cv2.namedWindow('screen', cv2.WINDOW_NORMAL) cv2.moveWindow('screen', LEFT, TOP) cv2.setWindowProperty('screen', cv2.WND_PROP_FULLSCREEN, cv2.WINDOW_FULLSCREEN) cv2.imshow('screen', screen) cv2.waitKey(0) For dynamic image size, ...

2020年3月20日 · aoirint

Flask, sqlalchemy

Flask ウェブアプリケーションフレームワーク Flask を使ってみる - Qiita Flaskで任意のデータを引数として受け取る方法 - Qiita python - redirect while passing arguments - Stack Overflow #url_for API — Flask 0.10.1 documentation python - How to serve static files in Flask - Stack Overflow python - Unable to retrieve files from send_from_directory() in flask - Stack Overflow python - Flaskで変数を文字列ではなくHTMLのタグとして読み込ませたい - スタック・オーバーフロー sqlalchemy 【PythonのORM】SQLAlchemyで基本的なSQLクエリまとめ - Qiita Object Relational Tutorial — SQLAlchemy 1.3 Documentation Python: SQLAlchemy + mysqlclient (MySQLdb) でマルチバイト文字を扱う - CUBE SUGAR CONTAINER Transactions and Connection Management — SQLAlchemy 1.3 Documentation Object Relational Tutorial — SQLAlchemy 1.3 Documentation SQLAlchemy で Delete するには? - Qiita Basic Relationship Patterns — SQLAlchemy 1.3 Documentation python - How to remove all items from many-to-many collection in SqlAlchemy? - Stack Overflow python - Flask-SQLAlchemy - model has no attribute ‘foreign_keys’ - Stack Overflow python - sqlalchemy dynamic filtering - Stack Overflow tagify Tagify - demo python-markdown Library Reference — Python-Markdown 3.2.1 documentation Extensions — Python-Markdown 3.2.1 documentation MathJax Getting Started — MathJax 2.7 documentation Combined Configurations — MathJax 2.7 documentation highlight.js How to use highlight.js highlight.js demo highlight.js/src/styles at master · highlightjs/highlight.js highlightjs-line-numbers.js - cdnjs.com - The best FOSS CDN for web related libraries to speed up your websites! wcoder/highlightjs-line-numbers.js: Line numbering plugin for Highlight.js Ace Editor Ace - The High Performance Code Editor for the Web ace/lib/ace/theme at master · ajaxorg/ace javascript - How do I get value from ACE editor? - Stack Overflow Unique/Random ID [Python] UUIDを生成するuuid.uuid4()はどうやってUUIDを生成しているのか? | Developers.IO #os.urandom os — 雑多なオペレーティングシステムインタフェース — Python 3.8.2 ドキュメント os.urandom(NUM_BYTES).hex()

2020年3月16日 · aoirint

git, markdown python

Git https://qiita.com/TakesxiSximada/items/ea778bb98b8c057ffd07 https://gitpython.readthedocs.io/en/stable/tutorial.html Markdown convert https://python-markdown.github.io/ https://qiita.com/masakuni-ito/items/593b9d753c44da61937b

2020年3月15日 · aoirint

RealSenseのカラー画像が暗い

使用:Intel RealSense SR300 pyrealsense2からget_color_frameで取得したカラー画像が暗かった。 RealSense SDKをインストールしてRealSense Viewerで確認してみると、RGB Cameraの項のEnable Auto Exposureの値がOFFになっていた。これをONにしたらプレビュー画像が明るくなった(露光の自動調整機能かな)。 次はコード(Python)からこのオプションを有効にする。(Pythonの)サンプルにはオプションをいじってるいい感じのものが見つからなかったので、以下を参考にしつつipythonで探した。 RealSense+Pythonの1コマンド環境構築 - Qiita enable/disable auto exposure · Issue #3141 · IntelRealSense/librealsense · GitHub デバイスとカラーセンサ(カメラ)を見つける部分(前半)は適当だけど、コード全体はこんな感じ。 import pyrealsense2 as rs import numpy as np import cv2 ctx = rs.context() device_list = ctx.query_devices() num_devices = device_list.size() print(num_devices) assert num_devices > 0 device = device_list[0] sensors = device.query_sensors() color_idx = -1 for i in range(len(sensors)): if not sensors[i].is_depth_sensor(): color_idx = i break assert color_idx != -1 color_sensor = sensors[color_idx] color_sensor.set_option(rs.option.enable_auto_exposure, 1) # on pipeline = rs.pipeline(ctx=ctx) config = rs.config() config.enable_stream(rs.stream.color, 640, 480, rs.format.bgr8, 30) pipeline.start(config) print('Initialized') try: while True: frames = pipeline.wait_for_frames() color_frame = frames.get_color_frame() if not color_frame: print('no frame') continue color_image = np.asanyarray(color_frame.get_data(), dtype=np.uint8) print(color_image.max(), color_image.min()) print(color_image.shape) cv2.namedWindow('RealSense', cv2.WINDOW_AUTOSIZE) cv2.imshow('RealSense', color_image) cv2.waitKey(1) finally: pipeline.stop() センサに対してオプションを設定する部分。 ...

2019年11月23日 · aoirint

darknet.py OpenCV

darknet.pyにコードが古くなってるっぽいexamples/detector-scipy-opencv.pyのOpenCV部を取り込み、Python 3用に import cv2 import sys, os sys.path.append(os.path.join(os.getcwd(),'python/')) import darknet as dn net = dn.load_net("cfg/yolov3.cfg", "backup/hoge.weights", 0) meta = dn.load_meta('cfg/yolov3.cfg') np_image = cv2.imread('data/dog.jpg') r = dn.detect_cv(net, meta, np_image) print(r) from ctypes import * import math import random import os DARKNET_SO_PATH = os.environ.get('DARKNET_SO_PATH', os.path.realpath('./libdarknet.so')) # assert os.path.exists(DARKNET_SO_PATH), DARKNET_SO_PATH def sample(probs): s = sum(probs) probs = [a/s for a in probs] r = random.uniform(0, 1) for i in range(len(probs)): r = r - probs[i] if r <= 0: return i return len(probs)-1 def c_array(ctype, values): arr = (ctype*len(values))() arr[:] = values return arr class BOX(Structure): _fields_ = [("x", c_float), ("y", c_float), ("w", c_float), ("h", c_float)] class DETECTION(Structure): _fields_ = [("bbox", BOX), ("classes", c_int), ("prob", POINTER(c_float)), ("mask", POINTER(c_float)), ("objectness", c_float), ("sort_class", c_int)] class IMAGE(Structure): _fields_ = [("w", c_int), ("h", c_int), ("c", c_int), ("data", POINTER(c_float))] class METADATA(Structure): _fields_ = [("classes", c_int), ("names", POINTER(c_char_p))] #lib = CDLL("/home/pjreddie/documents/darknet/libdarknet.so", RTLD_GLOBAL) # lib = CDLL("libdarknet.so", RTLD_GLOBAL) lib = CDLL(DARKNET_SO_PATH, RTLD_GLOBAL) lib.network_width.argtypes = [c_void_p] lib.network_width.restype = c_int lib.network_height.argtypes = [c_void_p] lib.network_height.restype = c_int predict = lib.network_predict predict.argtypes = [c_void_p, POINTER(c_float)] predict.restype = POINTER(c_float) set_gpu = lib.cuda_set_device set_gpu.argtypes = [c_int] make_image = lib.make_image make_image.argtypes = [c_int, c_int, c_int] make_image.restype = IMAGE get_network_boxes = lib.get_network_boxes get_network_boxes.argtypes = [c_void_p, c_int, c_int, c_float, c_float, POINTER(c_int), c_int, POINTER(c_int)] get_network_boxes.restype = POINTER(DETECTION) make_network_boxes = lib.make_network_boxes make_network_boxes.argtypes = [c_void_p] make_network_boxes.restype = POINTER(DETECTION) free_detections = lib.free_detections free_detections.argtypes = [POINTER(DETECTION), c_int] free_ptrs = lib.free_ptrs free_ptrs.argtypes = [POINTER(c_void_p), c_int] network_predict = lib.network_predict network_predict.argtypes = [c_void_p, POINTER(c_float)] reset_rnn = lib.reset_rnn reset_rnn.argtypes = [c_void_p] _load_net = lib.load_network _load_net.argtypes = [c_char_p, c_char_p, c_int] _load_net.restype = c_void_p do_nms_obj = lib.do_nms_obj do_nms_obj.argtypes = [POINTER(DETECTION), c_int, c_int, c_float] do_nms_sort = lib.do_nms_sort do_nms_sort.argtypes = [POINTER(DETECTION), c_int, c_int, c_float] free_image = lib.free_image free_image.argtypes = [IMAGE] letterbox_image = lib.letterbox_image letterbox_image.argtypes = [IMAGE, c_int, c_int] letterbox_image.restype = IMAGE _load_meta = lib.get_metadata lib.get_metadata.argtypes = [c_char_p] lib.get_metadata.restype = METADATA load_image = lib.load_image_color load_image.argtypes = [c_char_p, c_int, c_int] load_image.restype = IMAGE rgbgr_image = lib.rgbgr_image rgbgr_image.argtypes = [IMAGE] predict_image = lib.network_predict_image predict_image.argtypes = [c_void_p, IMAGE] predict_image.restype = POINTER(c_float) def classify(net, meta, im): out = predict_image(net, im) res = [] for i in range(meta.classes): res.append((meta.names[i], out[i])) res = sorted(res, key=lambda x: -x[1]) return res def load_net(cfg_path, weights_path, clear=0): return _load_net(cfg_path.encode('ascii'), weights_path.encode('ascii'), clear) def load_meta(cfg_path): return _load_meta(cfg_path.encode('ascii')) def _detect(net, meta, im, thresh=.5, hier_thresh=.5, nms=.45): num = c_int(0) pnum = pointer(num) predict_image(net, im) dets = get_network_boxes(net, im.w, im.h, thresh, hier_thresh, None, 0, pnum) num = pnum[0] if (nms): do_nms_obj(dets, num, meta.classes, nms); res = [] for j in range(num): for i in range(meta.classes): if dets[j].prob[i] > 0: b = dets[j].bbox res.append((meta.names[i], dets[j].prob[i], (b.x, b.y, b.w, b.h))) res = sorted(res, key=lambda x: -x[1]) free_detections(dets, num) return res def detect(net, meta, image_path, thresh=.5, hier_thresh=.5, nms=.45): im = load_image(image_path, 0, 0) res = _detect(net, meta, im, thresh, hier_thresh, nms) free_image(im) return res def array_to_image(arr): arr = arr.transpose(2,0,1) c = arr.shape[0] h = arr.shape[1] w = arr.shape[2] arr = (arr/255.0).flatten() data = c_array(c_float, arr) im = IMAGE(w,h,c,data) return im def detect_cv(net, meta, np_image, thresh=.5, hier_thresh=.5, nms=.45): im = array_to_image(np_image) rgbgr_image(im) return _detect(net, meta, im, thresh, hier_thresh, nms)

2019年10月30日 · aoirint

Yolo v3でObject Detectionする(darknet)

https://github.com/pjreddie/darknet git clone https://github.com/pjreddie/darknet.git データセットの作成 mydata.data classes = CLASS_NUM train = mydata-train.txt test = mydata-test.txt names = mydata.names backup = backup/mydata/ 各ファイルパスはdarknetの実行ディレクトリからの相対パス。 mydata.names category1 category2 category3 ... categoryCLASS_NUM ラベル=[クラスの数値表現]に対応するクラス名(行番号=ラベル)を記述する。 mydata-train.txt、mydata-test.txtにはデータセット(訓練データ、テストデータ)に含まれる画像のパスをそれぞれ1画像=1行で記述する。 データセットの画像と同じ階層に、IMAGE.jpgのアノテーション情報としてIMAGE.txtを配置する必要がある(1画像=1アノテーションファイル)。 IMAGE.txt label center_x center_y width height カラムはスペース区切りで、BoundingBox1つ=1行で記述する。 画像中のオブジェクトの種類はlabel(0始まりの数値)で表現する。 画像中のオブジェクトのBoundingBoxはcenter_x、center_y、width、height(オブジェクト中心X座標、オブジェクト中心Y座標、オブジェクト幅、オブジェクト高さ)の4パラメータで表現する。center_x、widthは画像幅で除算、center_y、heightは画像高さで除算し、実数で記述する。 設定ファイルの作成 cfgディレクトリ以下のファイルをベースに使う。 batch、subdivision, width, heightなどをメモリサイズなどに応じて変更する。デフォルトでは画像にランダムリサイズがかかるようになっているので、メモリ使用量が変動することに注意。 Yolo v3 cfg/yolov3.cfgをコピーする(mydata-yolov3.cfg)。 CLASS_NUM=クラス数 # L610, 696, 783 classes=CLASS_NUM # L603, 689, 776 filters=(CLASS_NUM + 5) * 3 Yolo v3の例 # L610, 696, 783 classes=1 # L603, 689, 776 filters=18 Tiny Yolo v3 cfg/yolov3-tiny.cfgをコピーする(mydata-yolov3-tiny.cfg)。 ...

2019年9月27日 · aoirint

CUDA setup (make darknet)

darknetのmakeに失敗するので、CUDA/NVIDIA Driverの再セットアップ。 https://developer.nvidia.com/cuda-downloads runfile (local)をダウンロード。 apt purge nvidia-* apt purge cuda-* reboot あとはrunfileを実行してCUIでNVIDIA DriverとCUDA Toolkitをインストール(CUIモードでsystemctl stop lightdm←16.04の場合だった、18.04ならgdm?)。 export PATH=/usr/local/cuda/bin:$PATH export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH .bashrc(Ubuntuの場合)に上の2行を追記する。 Ubuntu 18.04.3 CUDA Toolkit 10.1 & NVIDIA Driver 418(cuda_10.1.243_418.87.00) darknet(#61c9d02) 上記の環境でdarknetのmakeに成功した。 https://pjreddie.com/darknet/ 参考 http://vastee.hatenablog.com/entry/2018/11/20/152234

2019年9月27日 · aoirint

Python ログ出力抑制 デコレータ

出力を抑制するデコレータ。 Python 3.7.4、ctypesを使ったライブラリ呼び出しで動作を確認(darknet.py)。 # 標準出力・標準エラー出力の抑制 def silent(verbose=False): def _silent(func): def wrapper(*args, **kwargs): if not verbose: devnull = open(os.devnull, 'w') stdout = os.dup(1) stderr = os.dup(2) os.dup2(devnull.fileno(), 1) os.dup2(devnull.fileno(), 2) res = func(*args, **kwargs) if not verbose: os.dup2(stdout, 1) os.dup2(stderr, 2) devnull.close() return res return wrapper return _silent 使い方のイメージ(デコレータなせいで長くなってしまう、デコレータじゃなくて単純にコールバック風に関数を呼び出すラップ関数作ってもいいかも…)。 def func(verbose=False): @silent(verbose=verbose) def _func(): cfunc() funcA() _func() funcB() 参考 Cの共有ライブラリがPythonの標準出力に印刷されないようにするにはどうすればいいですか? - コードログ ctypes - How do I prevent a C shared library to print on stdout in python? - Stack Overflow 標準出力を黙らせるデコレーター - Qiita Pythonのデコレータについて - Qiita Capturing print output from shared library called from python with ctypes module - Stack Overflow

2019年9月25日 · aoirint

ログ監視 Python watchdog(ログローテーション未完成)

アプリケーションのログファイルを監視するシステムをつくる。 ファイルの更新をきっかけにコマンド実行 (python編) - Qiita ログ監視スクリプト - Qiita 上の2つをがっちゃんこしたやつを作った。ファイルの変更監視はwatchdog、読み取りはふつうのIO。 ※ うーん、ログローテーション対応が微妙かも from watchdog.observers import Observer from watchdog.events import FileSystemEventHandler import time import os from stat import * class FileWatchHandler(FileSystemEventHandler): def __init__(self, path): self.path = os.path.realpath(path) self.fp = None self.fpos = None self.init() filesize = os.stat(self.path)[ST_SIZE] self.fp.seek(filesize) # ファイル末尾 self.fpos = filesize def init(self): fp = self.fp if fp: fp.close() fp = open(self.path, 'r') self.fp = fp self.fpos = None def on_created(self, event): if event.src_path == self.path: print('reset') self.init() def on_modified(self, event): if event.src_path == self.path: print('modified') self.tail_f() def tail_f(self): if self.fpos: self.fp.seek(self.fpos) while True: self.fpos = self.fp.tell() line = self.fp.readline() if not line: break self.analyze(line) def analyze(self, line): # TODO: print('!', line) def close(self): self.fp.close() path = 'test.txt' handler = FileWatchHandler(path) observer = Observer() observer.schedule(handler, os.path.dirname(os.path.realpath(path))) observer.start() try: observer.join() except KeyboardInterrupt: pass observer.stop() handler.close() print('closed') ※ ちょっと修正してみたけど、やっぱり微妙 ...

2019年7月10日 · aoirint

json, bson, sqlite3 IOの実験メモ

Windows 10 Python 3.6.6 bson==0.5.7 SSD JSON import json import random import time file = 'test.tmp' N = 500 # Generate start = time.time() entries = [] for i in range(N): title = ''.join([ chr(random.randint(ord('あ'), ord('ん')+1)) for i in range(32) ]) body = ''.join([ chr(random.randint(ord('あ'), ord('ん')+1)) for i in range(30000) ]) entries.append({ 'id': i, 'title': title, 'body': body, }) data = { 'entries': entries, } end = time.time() print('Generate: %.1fs' % (end - start, )) Generate: 38.6s import os # Write start = time.time() with open(file, 'w', encoding='utf-8') as fp: json.dump(data, fp, ensure_ascii=False) end = time.time() print('Write: %.3fs' % (end - start, )) print('%.2fMB' % (os.path.getsize(file)/(1024**2), )) # Read start = time.time() with open(file, 'r', encoding='utf-8') as fp: data = json.load(fp) end = time.time() print('Read: %.3fs' % (end - start, )) Write: 0.252s 42.98MB Read: 0.214s BSON pip install bson import bson # Write start = time.time() s = bson.dumps(data) print('%.2fMB' % (len(s)/(1024**2), )) dumpEnd = time.time() with open(file, 'wb') as fp: fp.write(s) end = time.time() print('Write: %.3fs (Dump: %.3fs)' % (end - start, dumpEnd - start)) # Read start = time.time() with open(file, 'rb') as fp: s = fp.read() loadStart = time.time() data = bson.loads(s) end = time.time() print('Read: %.3fs (Load: %.3fs)' % (end - start, end - loadStart)) 42.98MB Write: 0.830s (Dump: 0.638s) Read: 0.156s (Load: 0.095s) SQLite3 import sqlite3 if os.path.exists(file): os.unlink(file) start = time.time() with sqlite3.connect(file) as db: cur = db.cursor() cur.execute( 'CREATE TABLE entries(id INTEGER AUTO INCREMENT, title TEXT, body TEXT)' ) for entry in data['entries']: cur.execute( 'INSERT INTO entries VALUES(?,?,?)', ( entry['id'], entry['title'], entry['body'], ), ) end = time.time() print('Write: %.3fs' % (end - start, )) start = time.time() with sqlite3.connect(file) as db: cur = db.cursor() results = [] for row in cur.execute('SELECT * FROM entries'): results.append(row) end = time.time() print('Read: %.3fs' % (end - start, )) print('%.2fMB' % (os.path.getsize(file)/(1024**2), )) db.close() Write: 1.093s Read: 0.243s 43.22MB

2018年12月15日 · aoirint