Python OpenCV

画像表示

ライブラリ読込

import cv2

画像読込

try:
 cv2.namedWindow('imageWindow')
 img = cv2.imread('images/test.jpg')

 if img is None:
  raise ValueError('ファイル無し')

except ValueError as e:
 print(e)
except:
 import traceback
 traceback.print_exc()

画像表示

cv2.imshow('imageWindow',img)

wait = True
while wait:
 wait = cv2.waitKey()=='q113'

起動時に受け取ったファイルパスの画像表示

起動例 python test.py pic/test.jpg

try:
 if len(sys.argv) < 2:
  raise ValueError('No Parameter')

 file = sys.argv[1]
 sys.argv[0]:〜/test.py

 cv2.namedWindow('imageWindow')
 img = cv2.imread(file)

 cv2.imshow(file, img)

except 〜

円を描く

center = (50, 50)
radius = 30 # 半径
color = (0, 200, 255)
cv2.circle(img, center, radius, color, thickness=None, lineType=None, shift=None)
cv2.imshow('imageWindow',img)

正方形を描く

cv2.rectangle(img, pt1, pt2, color, thickness=None, lineType=None, shift=None)
cv2.imshow('imageWindow',img)

文字を描く

cv2.putText(img, text='文字', org=(20, 50), fontFace=cv2.FONT_HERSHEY_COMPLEX, fontScale=1.1, color, thickness=None, lineType=None, bottomLeftOrigin=None)
cv2.imshow('imageWindow',img)

縮小

height = int(img.shape[0])
width = int(img.shape[1])
RESEZE_SCALE = 0.5
dsize = (int(width * RESEZE_SCALE), int(height * RESEZE_SCALE))
effect = cv2.resize(img, dsize)
cv2.imshow('imageWindow', effect)

指定の横幅まで拡大

height = int(img.shape[0])
width = int(img.shape[1])
RESEZE_WIDTH = 640 #px
dsize = (RESEZE_WIDTH, int( (RESEZE_WIDTH/width) * height) )
effect = cv2.resize(img, dsize)

cv2.imshow('imageWindow', effect)

回転

height = int(img.shape[0])
width = int(img.shape[1])
center = ( int(width/2), int(height/2) )
rotate = cv2.getRotationMatrix2D(center, angle=20.0, scale=1.0)
effect = cv2.warpAffine(img, rotate, (width, height))
cv2.imshow('imageWindow', effect)

色反転

effect = cv2.bitwise_not(img)
cv2.imshow('imageWindow', effect)

モザイク

height = int(img.shape[0])
width = int(img.shape[1])

MOSAIC_SCALE = 0.1 #縮小率
dsize = ( round(width*MOSAIC_SCALE), round(height*MOSAIC_SCALE) )
effect = cv2.resize(img, dsize) #縮小
effect = cv2.resize(effect, (width, height), interpolation=cv2.INTER_NEAREST) #拡大

cv2.imshow('imageWindow', effect)

グレースケール

effect = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
cv2.imshow('imageWindow', effect)

2値化

effect = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
retValue, effect = cv2.threshold(effect, thresh=100, maxval=200, type=cv2.THRESH_BINARY, dst=None)
cv2.imshow('imageWindow', effect)

輪郭抽出(ラプラシアン)

effect = cv2.Laplacian(img, ddepth=-1)
cv2.imshow(‘imageWindow’, effect)

輪郭抽出(ソーベル)

effect = cv2.Sobel(img, ddepth=-1, dx=0, dy=1)
cv2.imshow(‘imageWindow’, effect)

輪郭抽出(キャニー)

effect = cv2.Canny(img, threshold1=10.0, threshold2=200.0, edges=None, apertureSize=None, L2gradient=None)
cv2.imshow(‘imageWindow’, effect)

画像認証

物体検出

import cv2
import sys
import os

画像サイズ調整
RESIZE_WIDTH = 800
if width < RESIZE_WIDTH:
 height = int(img.shape[0])
 width = int(img.shape[1])
 dsize = (RESIZE_WIDTH, int((RESIZE_WIDTH/width)*height))
 resize = cv2.resize(img, dsize)
else:
 resize = img

グレースケール
effected = cv2.cvtColor(resize, cv2.COLOR_RGB2GRAY)

評価器
CASCADE_FILE = 'AI/haarcascade_frontalface_alt.xml'

ファイル存在チェック
assert os.path.isfile(CASCADE_FILE)

検出器
haar_cascade = cv2.CascadeClassifier(CASCADE_FILE)

検出
scaleFactor:入力画像の縮小率
minNeighbors:物体候補となる矩形は、最低でもこの数だけの近傍矩形を含む必要がある
minSize:物体が取り得る最小サイズ。これよりも小さい物体は無視される 
detected = haar_cascade.detectMultiScale(effected, scaleFactor=1.1, minNeighbors=2, minSize=(30, 30))

if len(detected)>0:
 検出箇所を四角で囲む
 for rect in detected:
  cv2.rectangle(effected, pt1=tuple(rect[0:2]), pt2=tuple(rect[0:2]+rect[2:4]), color=(0, 0, 255), thickness=2)
else:
 cv2.putText(effected, text='No Match Found', org=(20, 50), fontFace=cv2.FONT_HERSHEY_COMPLEX, fontScale=1.0, color=(0, 0, 255), thickness=2)

cv2.imshow(file, effected)

テンプレートマッチング

img = cv2.imread('images/test1.jpg')
img_template = cv2.imread('images/test2.jpg')

テンプレートマッチング
result_match = cv2.matchTemplate(img, img_template, method=cv2.TM_CCOEFF_NORMED, result=None, mask=None)
cv2.imshow(‘result’, result_match)

マッチング位置取得
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result_match)
top_left = max_loc
bottom_light = (top_left[0] + img_template.shape[1], top_left[1] + img_template.shape[0])

マッチング結果描画
cv2.rectangle(img, pt1=top_left, pt2=bottom_light, color=(0, 0, 255), thickness=2)

cv2.imshow(file, effected)

Follow me!