ubuntu 動画ファイルから音声のみを抽出
$ ffmpeg -y -i input.mp4 -ab 128k output.mp3
ubuntu 連番画像から動画を作る
コマ落ちを防ぐために1秒間に30枚取得していたものを1秒間に60枚をのせるという設定.
$ ffmpeg -r 30 -i image_%03d.png -vcodec libx264 -pix_fmt yuv420p -r 60 out.mp4
python コマンドの実行
import commands print(commands.getstatusoutput("ls")) #(0, 'IMG\nhaihuri_op.mp4\nsample.py') print(commands.getoutput("ls")) #IMG #haihuri_op.mp4 #sample.py
python opencv7 カスケード分類器
事前に学習したい物体の特徴を抽出して, 特徴量を機械が学習し, 学習データのまとまりをカスケード分類器というらしい.
OpenCVでは"/usr/local/share/OpenCV/haarcascades/lbpcascade_animeface.xml"のようにxml形式で扱う.
pythonでは読み込んだ画像を
1.グレースケールに変換する.
image_gray = cv2.cvtColor(image, cv2.cv.CV_BGR2GRAY)
#読み込む際にimage_gray = cv2.imread(image_path,0)でもOKだった
2.カスケード分類器の特徴量を取得
#cascade_path = "/usr/local/share/OpenCV/haarcascades/haarcascade_frontalface_alt.xml"#普通の顔 cascade_path = "/usr/local/share/OpenCV/haarcascades/lbpcascade_animeface.xml" #アニメ顔 cascade = cv2.CascadeClassifier(cascade_path)
3.認識の実行
facerect = cascade.detectMultiScale(image_gray, scaleFactor=1.2, minNeighbors=2, minSize=(10, 10)) #[ [顔1の範囲: x座標 y座標 横 縦] # [顔1の範囲: x座標 y座標 横 縦] #]
より精度を上げたかったり, 標準に備わってなかったりする物体を認識させるためには自分で機械学習を行い分類器を作る必要があるらしい.
認識した顔の画像をファイルへ出力
i = 0; for rect in facerect: #顔だけ切り出して保存 x,y,width,height = rect#x座標, y座標, 横の長さ, 縦の長さ dst = image[y:y+height, x:x+width]#画像の切り出し cv2.imwrite("出力先のパス", dst) i += 1
画像に長方形を描画する.
cv2.rectangle(image, tuple(rect[0:2]),tuple(rect[0:2] + rect[2:4]), color, thickness=5) #cv2.rectangle(img, 始点のタプル, 終点のタプル, 色, 線の太さ)
顔を囲った画像をファイルへ出力
if len(facerect):#顔があったら color = (0, 0, 255) #BGR for rect in facerect: #検出した顔を囲む矩形の作成 cv2.rectangle(image, tuple(rect[0:2]),tuple(rect[0:2] + rect[2:4]), color, thickness=2) #認識結果の保存 cv2.imwrite(出力先のパス, image)
ここにあるコードのカスケードを変更して実行すると下のようになった.
famirror.hateblo.jp
認識できていない場合もあった.
目が2つないとダメなのかな?
OpenCVで物体検出器を作成① 基礎知識【開発会社プロフェッサ】
ultraist.hatenablog.com
opencv.blog.jp
famirror.hateblo.jp
【追記:2017:03:25】
(^_^)の画像は認識されていたようなので,(・_^)のように左右の目が統一されてない画像に弱いっぽい.
python ファイル読み込み
python sample.py img.jpg
のように引数を取るには下のように書けばよい.
args = sys.argv #sample.py img.jpg argc = len(args) if(argc != 2): print '引数を指定して実行してください' quit() image_path = args[1]#sample.jpg
python opencv6 グレイスケールへの変換
cv2.cvtColor(img,cv2.COLOR_RGB2GRAY)を用いる.
imgread()で第二引数に0を指定しても同じ効果な気がする.
# -*- coding: utf-8 -*- import cv2 def main(): img = cv2.imread("cocoa.jpg",0) cv2.imshow("cocoa",img) img = cv2.imread("cocoa.jpg") gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY) # RGB画像をグレースケールに変換 cv2.imshow("gray scale",gray) cv2.waitKey(0) cv2.destroyAllWindows() if __name__ == '__main__': main()
cv2.COLOR_RGB2GRAYの代わりにcv2.COLOR_BGR2HSVとすると下のようになった.
# -*- coding: utf-8 -*- import cv2 def main(): img = cv2.imread("cocoa.jpg") gray = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) cv2.imshow("gray scale",gray) cv2.waitKey(0) cv2.destroyAllWindows() if __name__ == '__main__': main()
python opencv5 画像の重ねあわせ
im = im1 + im2という感じで重ねあわせられる(すごすぎ!)
im1,im2は同じサイズでなければならない.
# -*- coding: utf-8 -*- import cv2 def main(): # 2枚の画像をグレースケールで取得 im1 = cv2.imread("test1.png",0) im2 = cv2.imread("test2.png",0) # 画像データを重ねあわせ im = im1 + im2 cv2.imshow("test",im) cv2.waitKey(0) cv2.destroyAllWindows() # ウィンドウ破棄 if __name__ == '__main__': main()
合成画像ではどちらかの画像がはっきり見えているから単にピクセルを重ねただけではないようである.
python opencv4 画像のりサイズ
画像のりサイズにはcv2.resize()を使う.
引数には読み込んだ画像と,リサイズしたい高さと幅のタプル
#!/usr/bin/env python # -*- coding: utf-8 -*- import numpy as np import cv2 # Load an color image in grayscale original_size_img = cv2.imread('cocoa.jpg',1)#0:グレースケール 1:通常 height = original_size_img.shape[0]#高さ width = original_size_img.shape[1]#幅 half_size_img = cv2.resize(original_size_img,(height/2,width/2)) cv2.imshow("original_size",original_size_img) cv2.imshow("half_size",half_size_img) cv2.waitKey(0) cv2.destroyAllWindows()
python opencv3 画像の範囲切り取り+保存
#!/usr/bin/env python # -*- coding: utf-8 -*- import numpy as np import cv2 # Load an color image in grayscale img = cv2.imread('cocoa.jpg',1)#0:グレースケール 1:通常 cv2.imshow('cocoa',img)#読み込んだ画像を表示 x = 200 y = 200 width = 100 height = 100 src = img dst = src[y:y+height,x:x+width]#(x,y)-(x+w,y+h)の正方形範囲を切り取る cv2.imwrite('dst.jpg',dst)#画像を保存
python opencv2 画素へのアクセス
RGBではなくBGRの順にリストになっているのが注意
#!/usr/bin/env python # -*- coding: utf-8 -*- import numpy as np import cv2 # Load an color image in grayscale img = cv2.imread('cocoa.jpg',1)#0:グレースケール 1:通常 cv2.imshow('cocoa',img)#読み込んだ画像を表示 px = img[100,100]#画素へのアクセス print px print "blue:",img[100,100,0] print "green:",img[100,100,1] print "red:",img[100,100,0] cv2.waitKey(0)#キーを押すと終了 cv2.destroyAllWindows()
Basic Operations on Images — OpenCV 3.0.0-dev documentation
opencv.blog.jp
python opencv1 画像を読み込んで表示
#!/usr/bin/env python # -*- coding: utf-8 -*- import numpy as np import cv2 # Load an color image in grayscale img = cv2.imread('cocoa.jpg',0)#0:グレースケール 1:通常 cv2.imshow('cocoa',img)#読み込んだ画像を表示 cv2.waitKey(0)#キーを押すと終了 cv2.destroyAllWindows()