opencv-python 3.3.0.10 : Python Package Index
実践コンピュータビジョン サンプルプログラム や OpenCVのソースに付属するサンプル( opencv/samples/python )を実行
install opencv-python
# yum install openssl-devel* $ wget https://www.python.org/ftp/python/2.7.14/Python-2.7.14.tar.xz $ tar -xvf Python-2.7.14.tar.xz $ cd Python-2.7.14 $ ./configure $ make $ make test # make install $ /usr/local/bin/python --version Python 2.7.14 # curl -kL https://bootstrap.pypa.io/get-pip.py | /usr/local/bin/python # pip install opencv-python : Installing collected packages: numpy, opencv-python Successfully installed numpy-1.13.3 opencv-python-3.3.0.10
実践コンピュータビジョン の10章
画像の読込みと、形状(size)取得、グレースケール化
#!/usr/local/bin/python # -*- coding: utf-8 -*- import cv2 def main(): # 画像load im = cv2.imread('empire.jpg') # 画像size h,w = im.shape[:2] print h,w # 別形式で保存 cv2.imwrite('result.png',im) # グレースケール化 gray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY) cv2.imwrite('result_gray.png',gray) if __name__ == '__main__': main()
↑こう書くと、↓こう変換
flood fillによる塗りつぶし
- flood fillは領域判定にも使用されるらしい
- cv2.floodFill()の仕様は、ちゃんとは理解していません
#!/usr/local/bin/python # -*- coding: utf-8 -*- from numpy import * import cv2 def main(): # 画像を読み込む filename = 'fisherman.jpg' im = cv2.imread(filename) h,w = im.shape[:2] # 塗りつぶしの例 diff = (6,6,6) mask = zeros((h+2,w+2),uint8) cv2.floodFill(im, # 元の画像 mask, # ???? (10,10), # 塗りつぶしの開始座標 (0,0,255), # 塗りつぶしの色(RGBの逆?(B->G->R)) diff, # 塗りつぶしの上限 diff) # 塗りつぶしの下限 # 結果を保存する cv2.imwrite('result_floodFill.jpg',im) if __name__ == '__main__': main()
↑こう書くと、↓こう変換
OpenCV3では、OpenCV2と異なり、画像サイズの縦横が反転する気がしますが、 気のせいかな?
積分画像作成
#!/usr/bin/python # -*- coding: utf-8 -*- import cv2 def main(): # 画像を読み込む im = cv2.imread('empire.jpg') gray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY) # 積分画像を計算する intim = cv2.integral(gray) # 255内に収まるように正規化し、保存 intim = (255.0*intim) / intim.max() cv2.imwrite('result_integral.jpg',intim) if __name__ == '__main__': main()
画像積分の仕様も、利用目的も理解していません...が ↑こう書くと、↓こう変換
OpenCV3 に付属のサンプルソース
opencv/samples/python 以下に大量にあります
Hough変換による直線検出
#!/usr/local/bin/python # Python 2/3 compatibility from __future__ import print_function import cv2 import numpy as np import sys import math def main(): fn = sys.argv[1] src = cv2.imread(fn) dst = cv2.Canny(src, 50, 200) cdst = cv2.cvtColor(dst, cv2.COLOR_GRAY2BGR) if True: # HoughLinesP lines = cv2.HoughLinesP(dst, 1, math.pi/180.0, 40, np.array([]), 50, 10) a,b,c = lines.shape for i in range(a): cv2.line(cdst, (lines[i][0][0], lines[i][0][1]), (lines[i][0][2], lines[i][0][3]), (0, 0, 255), 3, cv2.LINE_AA) else: # HoughLines lines = cv2.HoughLines(dst, 1, math.pi/180.0, 50, np.array([]), 0, 0) if lines is not None: a,b,c = lines.shape for i in range(a): rho = lines[i][0][0] theta = lines[i][0][1] a = math.cos(theta) b = math.sin(theta) x0, y0 = a*rho, b*rho pt1 = ( int(x0+1000*(-b)), int(y0+1000*(a)) ) pt2 = ( int(x0-1000*(-b)), int(y0-1000*(a)) ) cv2.line(cdst, pt1, pt2, (0, 0, 255), 3, cv2.LINE_AA) cv2.imshow("detected lines", cdst) cv2.imwrite('houghlines.png',cdst) if __name__ == '__main__': main()
cv2.HoughLinesP()と、cv2.HoughLines()の違いを理解していませんが、 ↑こう書くと、↓こう変換