読者です 読者をやめる 読者になる 読者になる

cv2で動画読み込み時にerror: (-215) size.width>0 && size.height>0というエラーが出る場合の対処法(Windows)

cv2 openCV python

概要

ネット上でよく見るWindowsへのcv2導入方法に従ってcv2を導入すると、動画読み込み時(cv2.videoCapture()使用時)に"error: (-215) size.width>0 && size.height>0"というエラーが出てくる。
これはffmpegのDLLがないため、動画が開けずに出てくるエラーだが、一見すると何を言っているのかわからない点が厄介。
このエラーにしばらく苦しんだので、解決方法を記しておく。

解決方法

よくあるWindowsへのcv2導入方法を見ると、

1.OpenCV2.4.1等をダウンロード
2.C:/opencv/build/python/2.7/x64の cv2.pydをC:/Python27/lib/site-packegesにコピー
(anacondaで導入している場合はC:/anaconda/lib/python27/site-packages等)

と、ここまでしか手順が書いていない場合がある。

確かにこれでもcv2がインポートできて使用できるのだが、掲題のエラーが出て動画読み込み時にエラーになってしまう。
これでは片手落ちだ・・・ということで、以下の通りffmpegのdllをコピーしてあげる。

3.opencv/build内にあるopencv_ffmpeg310.dllも一緒に2のフォルダにコピー

これで正常にファイルが読み込めるようになるはず。
opencv_ffmpeg310.dllが見つからない場合は、適当にドライブ内を検索してやればOK。

sshfs中に通信が切れた場合の対処法

ubuntu linux

sshfsの問題点

機械学習を行う際、基本的に自宅サーバーのフォルダをsshfsでマウントして、作業を行っている。

t-nkb.hatenablog.com


しかし、アンマウントを忘れて通信を切断、スリープしてしまうとマウントポイントが残ったままとなり、以降このディレクトリにアクセスできなくなる。
当然、この状態になると、再度sshfsでマウントしようとしても以下のエラーが出て、マウントできない。

例えばmacだとこんな感じでエラーが出る。

mount_osxfuse: mount point (マウント先リンク) is itself on a OSXFUSE volume
fuse: failed to mount file system: Invalid argument

解決策(接続時に自動で強制アンマウントさせる)

そこで、エラーが出たマウント先を強制的にアンマウントし、再度接続してあげる。

umount -f (マウント先ディレクトリ)

以下のようにエイリアス作っちゃうと便利。

alias sshfs2="umount -f (マウント先ディレックトリ);(マウント元アドレス):(マウント元ディレクトリ) (マウント先ディレクトリ)"

linux screen中にマウスホイールでスクロールする方法

linux ubuntu ツール

sshが切れても学習が継続できるよう、最近はscreenを使って学習をすすめることが多い。
携帯からでも気軽に途中経過見えるし。
しかし、screenの画面はスクロール等が実行できず、過去のログを閲覧することができない。

t-nkb.hatenablog.com

困って検索したところ、以下のように設定を変更することで、マウスホイールで過去ログが見られるようになった。
これは便利!

$ sudo emacs ~/.screenrc

以下を追記(最初は新規作成)
ついでにスクロールバッファ行も増やしておく。

termcapinfo xterm* ti@:te@
defscrollback 100000

screenを再起動
screenが初期化されるので、作業中の場合注意。

$ reset

再開時は画面に表示されている分しか履歴が表示されず、スクロールしても過去ログの部分は空白になってしまうため、都度以下を行う必要がある。
これで読み込んでしまえば、読み込んだ部分は編集モードに遷移しなくとも参照可能。

・一旦、ctrl + a,escとして編集画面に遷移
・⬆️ボタン長押しで過去のログを読み込み
・escキーを押して元のモードに遷移

cv2(openCV)で動画の途中から再生する方法

python ubuntu openCV cv2

概要

openCVで動画の任意の地点から再生を開始する方法をまとめる。
これまではwhileループで1フレームずつ取得し読み飛ばしていた。しかし、この方法はあまりにも無駄が多い・・・時間もかかるし、HDDにも悪影響が出そう。
ということで、もう少し効率の良い方法を調べてみた。

従来方法

飛ばしたい時間分フレームを読みこませるだけ、簡単だけど、100秒のスキップに10秒ほど時間がかかる。
流石にこれじゃねぇ・・・。ということで、次の手法。

movie = cv2.VideoCapture(input_filename)
if movie.isOpened() == True:
    ret,frame = movie.read()
else:
    ret = False


# フレームを連続で読み込ませる
for i in range(framerate*shift_time):
    ret,frame = movie.read()

高速手法

開始のゼロ点をms単位でセットしてあげるだけ。スキップはほぼ一瞬。
HDDへのアクセスも少なく、パソコンに優しい!

movie = cv2.VideoCapture(input_filename)
if movie.isOpened() == True:
    ret,frame = movie.read()
else:
    ret = False

#スタート地点をsetする
movie.set(0,shift_time*1000)
ret,frame = movie.read()

疑問点

h264動画を取得すると、以下のエラーが出る。
キーフレームが見つからないってことなんだろうけど・・・・。
このエラーが出てもとりあえず読み込めてるから、とりあえず用は足りる。
(キーフレームが出るまで再読込してるのかな??本当はopenCVのソース読んで確認すべき。)

[h264 @ 0x2f1fac0] Missing reference picture, default is 0
[h264 @ 0x2f1fac0] decode_slice_header error

pythonでgooglemap情報を扱う方法まとめ

linux python ubuntu

概要

googlemapデータを機械学習の元ネタにするために、データの取り扱い方を調べたのでまとめておく。

地名から座標(緯度経度)、詳細住所を取得する

pipでインストール

pip install pygeocoder


あとはpythonで書くだけ。

from pygeocoder import Geocoder
address = '国会議事堂'
results = Geocoder.geocode(address)
print(results[0].coordinates)
# => (35.675888, 139.744858)

result = Geocoder.reverse_geocode(*results.coordinates, language="ja")
print result
# => 日本, 〒100-0014 東京都千代田区永田町1丁目7−1 国会議事堂

ふむ、簡単にかける割にはすごい。

特定の座標周辺の地図を画像として保存

次は、上記で得た座標を元に周辺の地図画像をダウンロードしてみる。
基本的には以下URLを参考にした。

Google Static Maps API入門
Google Mapの地図の画像を取得するには – 山本隆の開発日誌

pipでライブラリをインストール

sudo pip install urllib

以下のように、地図画像を取得して保存させる。
自分で書いておいてなんだけど、いまいち美しくない…。

from pygeocoder import Geocoder
import urllib

def download_pic(url,filename):
	img = urllib.urlopen(url)
	localfile = open( "./" + str(filename) + ".png" , 'wb')
	localfile.write(img.read())
	img.close()
	localfile.close()

address = 'ホワイトハウス'
results = Geocoder.geocode(address)
print(results[0].coordinates)

result = Geocoder.reverse_geocode(*results.coordinates, language="ja")
print result

html1 = "https://maps.googleapis.com/maps/api/staticmap?center="
html2 = "&maptype=hybrid&size=640x480&sensor=false&zoom=18&markers="
html3 = "&key=googleから取得したキーコードを入力"

axis = str((results[0].coordinates)[0]) + "," + str((results[0].coordinates)[1])

html = html1 + axis + html2 + axis + html3

print html

download_pic(html,address)

f:id:t_nkb:20161221131234p:plain

ちゃんとホワイトハウス周辺の地図が保存できた。さすがグーグル、使いやすくできてる。
細かなパラメータについては上記リンクを参照。

フォルダ内の全画像ファイルに対して一括処理を行う(python)

DeepLearning python

機械学習を行う際、webでスクレイピングした大量の画像ファイル等を一括で操作したくなることが多い。
その場合ファイル名も拡張子もバラバラで保存されるため、処理する際にいつも悩む。
毎回調べるのもバカらしいので、サンプルとしてまとめておく。
pythonだとこういう処理が書きやすくて便利。

# -*- coding: utf-8 -*-
import os
import cv2

def main():
    data_dir_path = u"./画像ディレクトリ名/"
    file_list = os.listdir(r'./画像ディレクトリ名/')

    for file_name in file_list:
        root, ext = os.path.splitext(file_name)
        if ext == u'.png' or u'.jpeg' or u'.jpg':
            abs_name = data_dir_path + '/' + file_name
            image = cv.imread(abs_name)
            #以下各画像に対する処理を記載する

if __name__ == '__main__':
    main()

ubuntuからgoogle remote desktopを削除する方法(deja-dup-moniter暴走時の対処法)

linux ubuntu

deja-dup-moniterが起動直後にPCのメモリを全部使用し始めて、パソコンが全く動かなくなったので調査。
メモリ24GBもあるのに全部使いやがるとは・・・。

調べると、ubuntu16.04とgoogle remote desktopの相性が悪いらしく、deja-dup-moniterと合わさると悪さを始める模様。

google remote desktopめ、ubuntu16ではインストールしてもまともに使えないばかりか、他に影響を与えるとは、もう許せん。
ということで、google remote desktopを削除することに。
そういえば、apt-getで入れたアプリケーションを検索して消したことなかったので、やり方も合わせてメモ

#まずはおおよそ当たりをつけたアプリ名で検索
$ dpkg -l | grep chrome

ii  chrome-remote-desktop                        55.0.2883.50                                          amd64        Chrome Remote Desktop Beta


#パッケージ名を把握したら、--purgeオプションをつけて完全に削除
$ sudo apt-get --purge remove chrome-remote-desktop 

再起動したらいつもどおりのメモリ消費量になっていて一安心。