OpenCV + Python で Video でネガポジ変換

昔の写真とネガを整理していて、写真とネガが別々に保存していました。このため、ネガイメージからだとどのネガがどの写真に対応しているのか、確認が難しいです。そこで、OpenCV + Python を使って、ネガポジ変換を行ってみました。

単純に、ネガポジ変換だけだと、全体的に青みがかった画像になり、思った色になりませんでした。そこで、青みがかった色を修正するために、ホワイトバランスの修正を行っています。これは、照明、撮像デバイス、ネガなどにより、パラメータを調整する必要があります。

ホワイトバランスは、単純にRGBのフィルムを通過した光のダイナミックレンジを一次式で正規化しているだけです。

つぎに、彩度が薄い感じだったので、RGBをHSV に変換し、彩度を1.5倍に上げてから、RGBに戻しています。これでだいたい何が写っているのか判別できるようになりました。

ほかの照明や撮像デバイスが異なると、色合いがおかしくなったりすると思いますが、地道にパラメータを調整する必要があります。

C#からすると違和感のあるPython 文法

概要文例
for の後の if 文 len([num for num in nums if num < 0])
暗黙の型変換bool(1), bool(0)
def という名前
関数の複数の戻り値
def least_difference(a, b, c):
diff1 = abs(a – b)
diff2 = abs(b – c)
diff3 = abs(a – c)
return min(diff1, diff2, diff3)
switch 文がない
else if ではなく、elif
def inspect(x):
if x == 0:
print(x, “is zero”)
elif x > 0:
print(x, “is positive”)
elif x < 0:
print(x, “is negative”)
else:
print(x, “is unlike anything I’ve ever seen…”)
標準ではconst がないPI = 3.14
トリプルクオート triplequoted_hello = “””hello
world”””
in planets = [‘Mercury’, ‘Venus’, ‘Earth’, ‘Mars’]
‘Saturn’ in planets
from import from math import *
print(pi, log(32, 2))
————-
from math import *
from numpy import *
print(pi, log(32, 2))
これは、path, numpy ともにlog が定義されているため、 TypeError: return arrays must be of ArrayType エラーとなる
dir print(dir(list))

[ WARN:0] videoio(MSMF): async ReadSample() call is failed with error status: -1

OpenCVで、突然次のエラーが出るようになった。
[ WARN:1] videoio(MSMF): can’t grab frame. Error

原因は、VideoCapture を2つのプロセスで起動していたため、あとから起動したプロセスがフレームを取得することができなかったため。

OpenCV: FFMPEG: tag 0x5634504d/’MP4V’ is not supported with codec id 12 and form
at ‘mp4 / MP4 (MPEG-4 Part 14)’
OpenCV: FFMPEG: fallback to use tag 0x7634706d/’mp4v’
[ WARN:0] videoio(MSMF): OnReadSample() is called with error status: -1072875772

[ WARN:0] videoio(MSMF): async ReadSample() call is failed with error status: -1
072875772
[ WARN:1] videoio(MSMF): can’t grab frame. Error: -1072875772
[ WARN:1] videoio(MSMF): can’t grab frame. Error: -2147483638
[ WARN:1] videoio(MSMF): can’t grab frame. Error: -2147483638
[ WARN:1] videoio(MSMF): can’t grab frame. Error: -2147483638
[ WARN:1] videoio(MSMF): can’t grab frame. Error: -2147483638

Module ‘cv2’ has no ‘VideoCapture’ memberpylint(no-member)

Visual Studio Code (Windows) で、CV2 で次の lint エラーが出る場合の解消法

Module ‘cv2’ has no ‘VideoCapture’ memberpylint(no-member)

[メニュー] →[ファイル] →[基本設定] →[設定]

設定タブが開くので、設定の検索に “lint” を入力

Python › Linting: Pylint Args
に、
–extension-pkg-whitelist=cv2
を追加して、セーブする。
似たような設定項目が多いので注意。

Download YouTube

テスト用の動画をYouTubeから調達

pip が壊れたので、修復

pip を実行すると、次のエラーが発生するようになった。原因不明。

PS C:\Users\仮面\Desktop\VideoTest> pip
Traceback (most recent call last):
File “d:\program files\python37\lib\runpy.py”, line 193, in run_module_as_main “main“, mod_spec) File “d:\program files\python37\lib\runpy.py”, line 85, in _run_code exec(code, run_globals) File “D:\Program Files\Python37\Scripts\pip.exe__main_.py”, line 5, in
ModuleNotFoundError: No module named ‘pip’

そこで、python -m ensurepip により、pip を修復

PS C:\Users\仮面\Desktop\VideoTest> python -m ensurepip
Looking in links: C:\Users\仮面\AppData\Local\Temp\tmp2qepvojk
Requirement already satisfied: setuptools in d:\program files\python37\lib\site-packages (40.8.0)
Collecting pip
Installing collected packages: pip
Successfully installed pip-19.0.3

Video の DCT, IDCT ローパス

OpenCvで、リアルタイムで、Video を200×200にスライスして、DCT→ローパス→IDCT を行ってみた。

左から、オリジナル、DCT、DCTの高周波成分をカット( 情報量はオリジナルの 1/100 )、IDCTで逆変換結果。

OpenCVで、動き検出

【爆速】OpenCVで複数の物体検出 -ラズパイ- を参考に、物体認識を試してみた。

単一オブジェクトの動き検出

KMeans を使って複数オブジェクトを認識をしてみたところ、ノイズがあると重心がうまく分離できず、Bounding Box が大きくずれてしまう。また、同一の物体であっても、複数のクラスターから構成されてしまうという問題点があった。

次に、オブジェクト輪郭検出 を参考に 複数のオブジェクトの動き認識してみた。 動いていないと認識できない、物体の特定ができない、といった問題があり、 正確ではないけれど、ある程度認識することができる。

drawContours だけで輪郭を描画できる。

OpenCv で動きを検出したらビデオに出力

動きを検出したら、ビデオき書き出す

OpenCvで timelapse

既存のビデオファイルから、タイムラプスを作成する方法

fourcc : Windows 10 の場合、次の動作を確認した。

フォーマットfourcc
aviDIVX
aviDIVX
wmvWMV1
wmvWNV2
mp4MP4V