PythonでMacのカメラからQRコードを読んでみた

QRコードをOpenCV+pyzbarで読んでみた。今更な感じもするけど、OpenCVおじさんとしてはやっておかないと。 人気記事: OpenCV + YOLOv3で物体検出を行う   環境構築 簡単に pip install –upgrade pip pip install opencv-python pyzbar numpy ソースコード from pyzbar.pyzbar import decode from pyzbar.pyzbar import ZBarSymbol import cv2 import numpy as np def edit_contrast(image, gamma): “””コントラクト調整””” look_up_table = [np.uint8(255.0 / (1 + np.exp(-gamma * (i – 128.) / 255.))) for i in range(256)] result_image = np.array([look_up_table[value] for value in image.flat], dtype=np.uint8) result_image = result_image.reshape(image.shape) return result_image if __name__ == “__main__”: capture = cv2.VideoCapture(0) if capture.isOpened() is False: raise(“IO Error”) while True: ret, frame = capture.read() if ret == False: continue # グレースケール化してコントラクトを調整する gray_scale = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) image = edit_contrast(gray_scale, 5) # 加工した画像からフレームQRコードを取得してデコードする codes = decode(image) if len(codes) > 0: for…

OpenCV + YOLOv3で物体検出を行う

どうも。帰ってきたOpenCVおじさんだよー。 そもそもYOLOv3って? YOLO(You Look Only Onse)という物体検出のアルゴリズムで、画像を一度CNNに通すことで物体の種類が何かを検出してくれるもの、らしい。 使い方(ほぼ独自のため、正しいかとても怪しい……) 環境構築 事前にTensorflowなりKerasなりOpenCVなりをインストールしておく。Pyenvなどの方法は割愛。わからなければこちらをみて。 python -m venv ~/.venv/yolo source ~/.venv/yolo/bin/activate pip install –upgrade pip pip install tensorflow pip instsall keras pip install opencv-python pip install pillow yolo.h5ファイルの作成 理解はあとにしておくことにして、yolo.weightsという学習データをyolo.h5というファイルに変換する必要がある。その方法は次の通り。 git clone https://github.com/xiaochus/YOLOv3 cd YOLOv3 python yad2k.py cfg/yolo.cfg yolov3.weights data/yolo.h5 とりあえずdemo.pyを実行してみる demo.pyを実行すると、次のような結果が出た python demo.py ブログには書いていないのだけれど、実のところYOLOv2も使っていて、それよりも精度が上がっている模様。 ただ、動作がだいぶ重く感じる。 オリジナルでカメラからキャプチャーしてみた。 OpenCVでカメラから取り出した画像を物体検出してみた。ソースコードは以下の通り。 “””Demo for use yolo v3 “”” import os import time import argparse import datetime import cv2 import numpy as np from PIL import Image from keras.models import load_model from model.yolo_model import YOLO IMAGE_DIR = os.path.dirname(os.path.abspath(__file__)) + “/images/output/” def process_image(img): “””Resize, reduce and expand image. # Argument: img: original image. # Returns image: ndarray(64, 64, 3), processed image. “”” image…

【Mac】brewだけでOpenCV3+Python3(venv)の環境を構築する

Homebrewをインストール [shell] /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" [/shell] Python3をインストール [shell] brew install python3 [/shell] Pyenvをインストール [shell] brew install pyenv echo ‘eval "$(pyenv init -)"’ >> ~/.bash_profile source ~/.bash_profile [/shell] Python 3.5.1をインストール [shell] pyenv install 3.5.1 pyenv local 3.5.1 pyenv global 3.5.1 python –version Python 3.5.1 [/shell] pyvenv環境を構築 [shell] mkdir ~/.venv pyvenv ~/.venv/opencv source ~/.venv/opencv/bin/activate pip install –upgrade pip [/shell] OpenCV3をインストール [shell] brew tap homebrew/science brew install opencv3 –with-python3 [/shell] 上記でうまくいかない場合 [shell] brew install opencv3 –with-contrib –with-python3 –without-python [/shell] 上で試してみるといいかもしれない。 numpy, ipythonをインストール [shell] pip install numpy ipython [/shell] venvのpython環境でOpenCV3を使えるようにする [shell] cd ~/.venv/opencv/lib/python3.5/site-packages/ ln -s /usr/local/Cellar/opencv3/3.1.0_3/lib/python3.5/site-packages/cv2.cpython-35m-darwin.so ./ [/shell] 確認 [shell] ipython In [1]: import cv2 # ERRORがでなければOK [/shell]

Python3 OpenCV3でK-Means法による減色処理

減色処理は、写真を油絵やイラストのように変換したいときに使われる。 [amazonjs asin=”4839952965″ locale=”JP” title=”OpenCV 3 プログラミングブック”]   前提 ディレクトリ構成などはこことかこことか。   元画像 カラス(karasu.jpg) をsource/imageディレクトリに設置する。   減色処理 sourceディレクトリにk_means.pyを作成する。 [python title=”k_means.pyの内容”] import numpy as np import cv2 if __name__ == ‘__main__’: img_src = cv2.imread(‘./image/karasu.jpg’) Z = img_src.reshape((-1,3)) # float32に変換 Z = np.float32(Z) # K-Means法 criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0) K = 4 ret,label,center=cv2.kmeans(Z, K, None, criteria, 10, cv2.KMEANS_RANDOM_CENTERS) # UINT8に変換 center = np.uint8(center) res = center[label.flatten()] img_dst = res.reshape((img_src.shape)) cv2.imshow(‘Quantization’, img_dst) cv2.waitKey(0) cv2.destroyAllWindows() [/python] 実行してみる。 [python] (opencv_python) $ python k_means.py [/python]   イラストのようなタッチになった。 Kの値を4から8に変えてみた。   少し元の画像に近づいた。

Python3 OpenCV3によるオプティカルフローによる物体検出

Python3 OpenCV3で画像の特徴点を抽出 に関連。 [amazonjs asin=”4839952965″ locale=”JP” title=”OpenCV 3 プログラミングブック”] 前提 ディレクトリ構成などはこことかこことか。 [shell title=”pipでインストールしたモジュール一覧”] gnureadline==6.3.3 ipython==3.1.0 matplotlib==1.4.3 nose==1.3.7 numpy==1.9.2 Pillow==2.9.0 pyparsing==2.0.3 python-dateutil==2.4.2 pytz==2015.4 scipy==0.16.0 six==1.9.0 sympy==0.7.6 [/shell] requirements.txtに上記の一覧を記述して、 [shell] $ pip install -r requirements.txt [/shell] とすればOpenCV以外の同じ環境が構築できる。   オプティカルフローとは オプティカルフローとは、「視覚表現(通常、時間的に連続するデジタル画像)の中で物体の動きをベクトル」とのこと。 連続するフレームの差分から算出して表示する。 手順は以下のとおり 1 フレーム画像(pre)を取得する。 2 フレーム画像をグレースケール変換する。 3 フレーム画像をHSV変換する。 —-ここからループ—- 4 カメラをキャプチャする。 5 フレーム画像(next)を取得する。 6 グレースケール変換する。 8 preとnextのグレースケール画像からオプティカルフローを計算する。 9 フローの角度と大きさを計算する。 10 計算した角度から色を決定する。 11 結果を表示する。 —-ここまでループ—-   オプティカルフローをしてみる sourceディレクトリにoptical_flow.pyを作成する。 [python title=”optical_flow.py”] # -*- coding: utf-8 -*- import cv2 import numpy as np if __name__ == ‘__main__’: cap = cv2.VideoCapture(0) ret, flame = cap.read() # グレースケール変換 img_gray_current = cv2.cvtColor(flame, cv2.COLOR_BGR2GRAY) # HSV変換 img_hsv = cv2.cvtColor(flame, cv2.COLOR_BGR2HSV) while(True): ret, flame = cap.read() img_gray_next = cv2.cvtColor(flame, cv2.COLOR_BGR2GRAY)…

Python3 OpenCV3を使って物体検出

Python3 OpenCV3で画像の特徴点を抽出 に関連。 [amazonjs asin=”4839952965″ locale=”JP” title=”OpenCV 3 プログラミングブック”] 前提 ディレクトリ構成などはこことかこことか。 [shell title=”pipでインストールしたモジュール一覧”] gnureadline==6.3.3 ipython==3.1.0 matplotlib==1.4.3 nose==1.3.7 numpy==1.9.2 Pillow==2.9.0 pyparsing==2.0.3 python-dateutil==2.4.2 pytz==2015.4 scipy==0.16.0 six==1.9.0 sympy==0.7.6 [/shell] requirements.txtに上記の一覧を記述して、 [shell] $ pip install -r requirements.txt [/shell] とすればOpenCV以外の同じ環境が構築できる。   物体検出について 1 検出する対象となる部分を決定する 2 Webカメラからフレーム画像を取得する 3 フレーム画像から検出を切り出して、HSV変換する 5 HSV画像からHSV値の範囲を指定してマスク画像の作成する。 6 マスク画像を生成する 7 マスク画像のヒストグラムを正規化する —-ここからは繰り返し—– 8 Webカメラからフレーム画像を取得する 9 ヒストグラム特徴量からフレーム画像と検出対象の画像の類似度を計算する(calcBackProjectメソッド) 10 フレームから追跡領域の場所を計算する(meanShiftメソッド) 10 計算結果をフレームに描く 11 表示する —-ここまで繰り返し—-   物体検出をしてみる sourceディレクトリにmeanshift.pyを作成する。 [python title=”meanshift.pyの内容”] # -*- coding: utf-8 -*- import numpy as np import cv2 if __name__ == ‘__main__’: cap = cv2.VideoCapture(0) # 追跡する枠の座標とサイズ x = 600 y = 200 w = 200 h = 200 track_window = (x, y, w, h) # フレームの取得 ret,frame = cap.read() #…

Python3 OpenCV3で2つの画像の一致する特徴を線で結ぶ

Python3 OpenCV3で画像の特徴点を抽出 に関連。 [amazonjs asin=”4839952965″ locale=”JP” title=”OpenCV 3 プログラミングブック”] 前提 ディレクトリ構成などはこことかこことか。 更に今回は描画のために、matplotlibをインストールした。 [shell] (opencv_python) $ pip install matplotlib [/shell] [shell title=”pipでインストールしたモジュール一覧”] gnureadline==6.3.3 ipython==3.1.0 matplotlib==1.4.3 nose==1.3.7 numpy==1.9.2 Pillow==2.9.0 pyparsing==2.0.3 python-dateutil==2.4.2 pytz==2015.4 scipy==0.16.0 six==1.9.0 sympy==0.7.6 [/shell] requirements.txtに上記の一覧を記述して、 [shell] $ pip install -r requirements.txt [/shell] とすればOpenCV以外の同じ環境が構築できる。   使用する画像 ダンボーの画像(dambo.jpg)とダンボーを逆さまにした画像(dambo_turn.jpg)を使用した。 source/imageディレクトリに設置した。       ちょっと(分かる範囲で)解説 SIFTやらORBやらなにやらでてきたので調べてみた。 SIFT・ORB SIFTは「Scale-Invariant Feature Transform」の略で、特徴点の検出と特徴量の出力を行うアルゴリズム。 画像などのマッチングや物体検出を行うときに使われる。 理論的な概要、解説に関してはこちらのpdfが読みやすい。 (数学系学科の初年度の微積分と線形代数を理解しているとある程度読める。) Gradient ベースの特徴抽出 -SIFT と HOG- ORBは「Oriented FAST and Rotated BRIEF」の略で、SIFTに変わる新たな特徴点の検出と特徴量の出力を行うディスパッチャー。 3Dの検出なども行うことができる模様。 英語だけど、こちらが参考になりそう。 ORB: an efficient alternative to SIFT or SURF A tutorial on binary descriptors – part 3 – The ORB descriptor   マッチングした特徴点を先で結ぶ ORBで特徴点の算出と特徴量を出力しマッチングして特徴点同士を描画して、matplotlibで表示する。 sourceディレクトリにdescripting.pyを作成する。 [python title=”descripting.pyの内容”] # -*- coding: utf-8 -*- import numpy as np import cv2 from matplotlib…

Python3 OpenCV3で指定した色のみを抽出して表示する【動画あり!】

これは色々楽しそう。 [amazonjs asin=”4061538225″ locale=”JP” title=”OpenCVによる画像処理入門 (KS情報科学専門書)”] 前提 ディレクトリ構成などはこことかこことか。   プログラムの流れ 1 抽出する色をHSVで範囲指定する。 2 カメラでキャプチャーする 3 取得したフレーム画像をHSV変換する 4 HSV変換した画像を二値化してマスク画像を作成する。 5 マスク画像の領域を元画像から集中する。   inRangeメソッド inRangeメソッドは、入力ソース画像から範囲指定した色の範囲にもとづいてマスク画像を生成する。 使い方は以下のとおり。 [python] # 取得する色の範囲を指定する lower_yellow = np.array([20, 50, 50]) upper_yellow = np.array([100, 255, 255]) # 指定した色に基づいたマスク画像の生成 img_mask = cv2.inRange(img_src, lower_yellow, upper_yellow) [/python]   色の抽出 今回はMacBookAirのカメラでキャプチャーし、フレーム単位で色の抽出を行った。 sourceディレクトリにcolor.pyを作成した。 [shell title=”color.pyの内容”] import cv2 import numpy as np cap = cv2.VideoCapture(0) while(1): # フレームを取得 ret, frame = cap.read() # フレームをHSVに変換 hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) # 取得する色の範囲を指定する lower_yellow = np.array([20, 50, 50]) upper_yellow = np.array([100, 255, 255]) # 指定した色に基づいたマスク画像の生成 img_mask = cv2.inRange(hsv, lower_yellow, upper_yellow) # フレーム画像とマスク画像の共通の領域を抽出する。 img_color = cv2.bitwise_and(frame, frame, mask=img_mask) cv2.imshow("SHOW COLOR IMAGE", img_color) # qを押したら終了 k = cv2.waitKey(1) if k…

Python3 OpenCV3で画像の特徴点を抽出

ちょっと苦労した。 [amazonjs asin=”4839952965″ locale=”JP” title=”OpenCV 3 プログラミングブック”] 画像の特徴点とは 画像の特徴点とは、画像の角の部分であったり曲線の極大点であったりと、その画像内で際立った部分のこと。 以下の画像の赤い部分。 顔など様々な判定をしたいときなどに使われそうなのはなんとなく想像できる。   前提 ディレクトリ構成などはこことかこことか。   元画像 ダンボーの画像(dambo.jpg)を使用した。   特徴点の抽出 OpenCV2(OpenCV3-alpha?)までは、FeatureDetector_createメソッドで特徴点の抽出が行えたが、OpenCV3では廃止されていた。 代わりに、FastFeatureDetector_createメソッドが実装されていたため、これを利用。 sourceディレクトリにcharacteristic.pyファイルを作成。 [python title=”characteristic.pyの内容”] # -*- coding: utf-8 -*- import cv2 import numpy as np if __name__ == ‘__main__’: # ファイル読み込み img_src = cv2.imread("./image/dambo.jpg") img_keypoint = img_src # キーポイントの検出 gftt = cv2.FastFeatureDetector_create() keypoints = gftt.detect(img_src) # キーポイントの数をターミナル上に表示 print(len(keypoints)) # 表示 img_keypoint = cv2.drawKeypoints(img_src, keypoints, img_keypoint) cv2.imshow("SHOW KEYPOINTS IMAGE", img_keypoint) cv2.waitKey(0) cv2.destroyAllWindows() [/python] 実行してみる。 [shell] (opencv_python) $ python characteristic.py [/shell]   できたー。  

LinuxMint(Ubuntu) 上のPython3にOpenCV3をインストール

ものすごいてこずったのと、pyenvで構築した環境へのインストールを試みたがうまくいかなかった。 しかしapt-getでインストールしたpythonでは一応構築できたため、備忘録。 [amazonjs asin=”4839952965″ locale=”JP” title=”OpenCV 3 プログラミングブック”] 前提 前庭と言うより、構築した時点でpyenvでのpython環境を構築していた。 そのため、少なからず影響がでうるため、以下の手順を前提としておく。 LinuxMint(Ubuntu) pyenvを使ったPython環境の構築   OpenCV3のインストール 依存関係のあるパッケージをインストールする。 [shell] sudo apt-get install libopencv-dev build-essential checkinstall cmake pkg-config yasm libtiff4-dev libjpeg-dev libjasper-dev libavcodec-dev libavformat-dev libswscale-dev libdc1394-22-dev libxine-dev libgstreamer0.10-dev libgstreamer-plugins-base0.10-dev libv4l-dev python3-dev python3-numpy libtbb-dev libqt4-dev libgtk2.0-dev libfaac-dev libmp3lame-dev libopencore-amrnb-dev libopencore-amrwb-dev libtheora-dev libvorbis-dev libxvidcore-dev x264 v4l-utils python3.4-dev python3-pip [/shell] https://opencv.org/downloads.html から Linux/Macのタイプをダウンロード ダウンロードディレクトリに解凍しておく。 make -j○ の○の部分はCPUのコア数。環境によって変更する。 [shell] cd ~/ダウンロード/opencv-3.0.0/build cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D BUILD_opencv_java=OFF -D WITH_IPP=OFF -D PYTHON_EXECUTABLE=/usr/bin/python3.4 .. make -j8 sudo make install [/shell] 使えるか確認する。 [python] /usr/bin/python3.4 >> import cv2 なにも表示されなければ成功。 [/python] 前提でpyenv環境を構築している場合は、pyenv local system などで一度pythonのパスをシステムの方に切り替えておくといいかも。

Python3 OpenCV3でアニメ顔を顔判定する

アニメの顔を判定できるとのこと。 にゃんぱすー。 [amazonjs asin=”4839952965″ locale=”JP” title=”OpenCV 3 プログラミングブック”] 前提 ディレクトリ構成などはこことかこことかこことか。   使用画像 のんのんびよりの画像(nonnon.jpg)を拝借。 source/imageディレクトリに設置した。   アニメ顔の分類機(xmlファイル)をダウンロード こちら から lbpcascade_animeface.xml をダウンロードし、haarcascades フォルダに入れておく。   アニメ顔を判定 sourceディレクトリにanime_face.pyを作成し顔判定した。 [python] # -*- coding: UTF-8 -*- import cv2 import math import numpy as np import os if __name__ == ‘__main__’: # 顔判定で使うxmlファイルを指定する。 cascade_path = os.path.dirname(os.path.abspath(__file__)) + "/haarcascades/lbpcascade_animeface.xml" cascade = cv2.CascadeClassifier(cascade_path) # 画像の読み込み img_src = cv2.imread("./image/nonnon.jpg", 1) # 結果を保存するための変数を用意しておく。 img_result = img_src # グレースケールに変換 img_gray = cv2.cvtColor(img_src, cv2.COLOR_BGR2GRAY) #顔判定 """ minSize で顔判定する際の最小の四角の大きさを指定できる。a (小さい値を指定し過ぎると顔っぽい小さなシミのような部分も判定されてしまう。) """ faces = cascade.detectMultiScale(img_gray, scaleFactor=1.1, minNeighbors=1, minSize=(100, 100)) # 顔があった場合 if len(faces) > 0: #顔認識の枠の色 color = (255, 0, 0) # 複数の顔があった場合、1つずつ四角で囲っていく for face in faces: # faceには(四角の左上のx座標, 四角の左上のy座標, 四角の横の長さ, 四角の縦の長さ) が格納されている。 # 囲う四角の左上の座標…

Python OpenCV3で画像のアスペクト比(縦横比)を求める

0.2回分の内容 [amazonjs asin=”4839952965″ locale=”JP” title=”OpenCV 3 プログラミングブック”]   前提 ディレクトリ構成などはこことかこことか。   画像のアスペクト比を求める この星風の画像のアスペクト比を求めてみる。 source/image ディレクトリにhoshi.pngを設置する。   画像のアスペクト比を求める、get_aspectratio関数を作成する。 sourceディレクトリに [python title=”aspect.pyの内容”] # -*- coding: UTF-8 -*- import cv2 import math import numpy as np import os def get_aspectratio(img_src): # 画素の行数、列数を取得 rows, cols = img_src.shape x_min = cols x_max = 0 y_min = rows y_max = 0 # 各行ごとに操作 for y in range(rows): # 各列ごとに操作 for x in range(cols): if img_src[y, x] == 255: if x < x_min: x_min = x elif x > x_max: x_max = x if y < y_min: y_min = y elif y > y_max: y_max = y aspectratio = float(y_max – y_min) / float(x_max – x_min) return…

【動画あり】Python3 OpenCV3で(MacBookAirのカメラで)フレーム差分

MacBookAirのカメラで動画をキャプチャーし、前のフレームとの差分を表示する。 [amazonjs asin=”4839952965″ locale=”JP” title=”OpenCV 3 プログラミングブック”]   前提 ディレクトリ構成などはこことかこことか。 &nbsp フレーム差分 解説はソースコードとソースコードのあとで。 sourceディレクトリにflame_substraction.pyを作成する。 [python title=”flame_substraction.py”] # -*- coding: UTF-8 -*- import cv2 import math import numpy as np import os if __name__ == ‘__main__’: # カメラからキャプチャー cap = cv2.VideoCapture(0) # 時刻tのフレーム画像 img_src1 = None # 時刻t+1のフレーム画像 img_src2 = None # 時刻t+2のフレーム画像 img_src3 = None while(True): # 動画ストリームからフレームを取得 ret, frame = cap.read() img_src1 = img_src2 img_src2 = img_src3 img_src3 = frame # img_src2 にまだ画像が入れられていない場合 if img_src1 is None: cv2.imshow("Show FLAME SUBSTRACTION Image", img_src3) else: # img_src1 と img_src2 の差分を求める img_diff1_2 = cv2.absdiff(img_src1, img_src2) # img_src2 と img_src3 の差分を求める img_diff2_3 = cv2.absdiff(img_src2, img_src3) # img_diff1_2 と img_diff2_3を二値化 img_diff1_2b = cv2.threshold(img_diff1_2, 20,…

Python3 OpenCV3で背景差分を求める

ある道を定点カメラで撮影している時に人がうつりこんできたら、その前の背景の差分を求めて人を抽出するような処理。 [amazonjs asin=”4061538225″ locale=”JP” title=”OpenCVによる画像処理入門 (KS情報科学専門書)”]   前提 ディレクトリ構成などはこことかこことか。   元画像 ダンボーの画像(dambo.jpg, dambo2.jpg) をsource/imageディレクトリに設置する。     背景差分 背景差分をを求める。 sourceディレクトリにbackground_substraction.pyを作成する。 [python title=”background_substraction.pyの内容”] # -*- coding: UTF-8 -*- import cv2 import math import numpy as np import os if __name__ == ‘__main__’: # 画像の読み込み img_src1 = cv2.imread("./image/dambo1.jpg", 1) img_src2 = cv2.imread("./image/dambo2.jpg", 1) # 背景画像との差分を算出 img_diff = cv2.absdiff(img_src2, img_src1) # 差分を二値化 img_diffm = cv2.threshold(img_diff, 20, 255, cv2.THRESH_BINARY)[1] # 膨張処理、収縮処理を施してマスク画像を生成 operator = np.ones((3, 3), np.uint8) img_dilate = cv2.dilate(img_diffm, operator, iterations=4) img_mask = cv2.erode(img_dilate, operator, iterations=4) # マスク画像を使って対象を切り出す img_dst = cv2.bitwise_and(img_src2, img_mask) # 表示 cv2.imshow("Show BACKGROUND SUBSTRACTION Image", img_dst) cv2.waitKey(0) cv2.destroyAllWindows() [/python] 実行。 [shell] (opencv_python)$ python background_substraction.py [/shell]   あまり綺麗に取得できなかった。 カメラで撮影したため、影などが入ったからかもしれない。