こないだAliexから届いた、USB接続SSD。あれにLinux Mintを
入れてみたんだけど、サクサク動くことはよくわかった。
普通にLinux Mintが起動できるんだけど、内蔵SSDと同じくらい
サクサク動く。ほほう。
ただ、なんかノートPCのBIOSのせいなのか、いつものように
USBコネクタにSSD繋いだ時にはUSB側から、繋いでない時には
内蔵SSDから起動、っていう感じに上手いこといかない。
なんかgrub画面が出てきちゃったり、起動ドライブを認識
できなかったりとかで、いちいちBIOSのブートシーケンスを
直さないといけなかったりする。なんでだろう?地味に不便。
メインのデスクトップPC側でやったら普通に動くのかな?
動くならいいんだけど、今ちょっとそういう実験やって
いられない状況下にあったりするので、まぁそれはまた今度。
なんか、ノートPCのブートシーケンス周りでは、こないだも
トラブってるから、あまりその辺の完成度を信頼できてない
んだよな。
こないだから、やってみよう、やってみようと思ってたこと
をちょっと手を動かしてみた。
PythonとOpenCV使って、動画ファイルから1コマ1コマ取り
出して、ゴニョゴニョ処理するプログラム書きたいと思って
いたんだけど、そもそもOpenCVで動画ファイルをいじるための
基本のキが解ってないので、その辺からまずは調べもの。
(1)Windows版ThonnyにOpenCVをpipでインストール
Linuxなら、サクッとpipコマンドでインストールできるん
だけど、Windows版のThonnyでpip使うのどうすればいいの?
と思って、調べてみた。
https://qiita.com/izuki_y/items/93a86c3de203acb82317
どうやら、メニューバーのToolsからOpen system shellを
開いてやれば、Thonnyの環境に合わせたディレクトリで
cmd.exeを開いてくれるので、そのままpipコマンドで
pip install opencv-python
と打てばいいみたい。なるほど。
(2)動画ファイルにアタッチしてもろもろの情報を取得
https://qiita.com/suzuki-navi/items/ffe449c95fb6e1faf891
ここのページに、ファイルを開いてからどうやったら各種の
属性値を取り出せるのか、プログラムが解説されてるので、
とりあえずそのままやってみる。
出来た。mpgファイルでも、aviファイルでもいけるみたい。
動画ファイルの縦横サイズ、再生時間、全フレーム数、
コーデックの種類なんかが取得できる。
(3)1フレーム抜き出して画像として書きだす
上記の参考ページにある続きの解説見ながら、特定フレームの
画像をイメージとして引っ張り出してきて、それをちょこっと
編集して、画像ファイルとして書き出してみる。
材料は参考ページに一通り載ってるので、それらを元にして
プログラムを書いていったんだけど、さらに画像をいじって
から出力できるように、空のイメージデータをメモリ上に
作る必要があるかなと。OpenCVで扱うこの手のイメージって、
numpy形式のデータらしいので、numpy形式のイメージの生成
周りを調べてみる。
https://tat-pytone.hatenablog.com/entry/2019/03/03/102503
ここにわかりやすく書かれてる。これを参考にして、
切り出したフレームと同じサイズの真っ黒(初期状態)
画像イメージを作っておいて、切り出したフレームの色を
反転させつつ、上下左右も反転させたイメージを書き込んで、
その画像をファイルに吐き出してみる。こんな感じ。
(元フレーム)
(出力画像)
以前実験で使った(というか作った)動画を材料にして、
50フレーム目を切り出して編集。
正確に言うと、プログラムのロジック的には動画の
50フレーム目を切り出して使うっていう処理になっている
んだけど、50フレーム目の画像を取り出してブログに貼る
のが面倒だったので、上記画像は50フレーム目付近のハード
コピーで代用。
(なので、これを処理しても完全に同一の画像にはならない
はず。サイズも異なってたりする)
出力画像のとおり、色と上下左右が反転しているのがわかる。
で、これがプログラム。
(例によって、このブログの制約のせいで、1行おきに間延び
しちゃうので、適当に編集してから眺めて頂ければと)
import cv2
import numpy as np
def buildVideoCaptures(videoPath, outputPath):
cap = cv2.VideoCapture(videoPath)
if not cap.isOpened(): return
# フレーム番号を設定
n = 50
cap.set(cv2.CAP_PROP_POS_FRAMES, n)
# 画像サイズを拾う
x_size = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
y_size = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
print(f"captured frame : x={x_size}, y={y_size}, frame number={n}")
_, img = cap.read()
# imgは、読み込んだフレームのNumpy配列でのピクセル情報(BGR)
# imgのshapeは (高さ, 横幅, 3)
print(f"image.shape = {img.shape}")
# numpyの黒いRGB画像を生成(3はRGB、np.uint8は0~255の8ビットunsigned)
img2=np.zeros((y_size, x_size, 3), np.uint8)
print(f"img2 : {img2.shape}")
# imgをピクセル単位で眺めて、反転してみる
for y in range(y_size):
for x in range(x_size):
b, g, r = img[y][x]
#print(f"x{x} y{y} r{r},g{g},b{b}")
nx = x_size - x - 1
ny = y_size - y - 1
img2[ny][nx][0] = 255 - b
img2[ny][nx][1] = 255 - g
img2[ny][nx][2] = 255 - r
# 画像ファイルで書きだす
# 描きだすときの画像フォーマットはファイル名から自動で決定
cv2.imwrite(outputPath, img2)
cap.release()
iVideo = ".\MVI_1925_clip1.avi"
oPicture = ".\MVI_1925_clip1.jpg"
buildVideoCaptures(iVideo, oPicture)
参考にさせていただいたプログラムをちょこっといじった
だけなので、それほど付け加えたことなないんだけど、まぁ
やりたいことの「材料」はおよそ揃った感じ。
これらを使って、ゴニョゴニョと処理するプログラムを
書いていこうかなと。
Pythonで画像処理っていうと、これまでPILばかり使ってた
ので、OpenCVではどういう風にゴニョゴニョすればいいん
だろうなと思ってたんだけど、まぁ、ライブラリを利用
すれば、そんなに大変なことはなかった。ありがたい。
先人に感謝。
あとは、フレーム間の比較をやりたいんだけど、それって
PILとnumpy形式、どっちが処理速いんだろうな?
https://www.youtube.com/watch?v=aRLkn0QDbbE
クロアリさん動画。
\宇宙のお姉さ~ん/
脚の震えを見れば想像できるけど、やっぱバンジーなんて
怖いよな。オイラは出来る気がしない。
https://minkara.carview.co.jp/userid/2398027/car/1904772/3341341/note.aspx
ほうほう、ABSカットスイッチ。
まぁ、普通ならヒューズ引っこ抜いて完了って感じになる
ものだと思うんだけど、こういう風にスイッチを付けて
オンオフできるようにしちゃうの、面白いな。
https://www.youtube.com/watch?v=QwDnzaeuNzw
コーラのハチミツの続き。3種類のジュースではちみつ。
面白い。
https://www.youtube.com/watch?v=vXpWsQptlRA
また、小岩の菖蒲園の季節になったのか。ニワトリさん動画
を見るようになってから、かれこれ1年ほど経つのか。
https://www.youtube.com/watch?v=NvsNMDgaTco
さやっち1時間。
もう、しょっぱなから面白い。
(飛ばし飛ばし見たけど、全体的に面白い)
https://www.youtube.com/watch?v=NvsNMDgaTco&t=1748s
特にこれ。妖精なことがばれてしまった。