私的AI研究会 > OpenCV3
「Python画像処理100 (Interface 2021年1月号)」CQ出版社刊 のサンプルコードを中心に検証をしてみる。
OpenVINO™ ツールキットをインストールした環境で検証する。
pi@raspberrypi:~ $ python3 Python 3.7.3 (default, Jul 25 2020, 13:03:44) [GCC 8.3.0] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import cv2 >>> cv2.__version__ '4.5.1-openvino' >>> quit()
pi@raspberrypi:~ $ ls Bookshelf Desktop Documents Downloads Music Pictures Public Templates Videos build cq workspace
~cq $ vi matchtemplate.py # -*- coding: utf-8 -*- import cv2 import numpy as np import time def __main(): img = cv2.imread('image/IMG_1630_2.jpg') temple = cv2.imread('image/IMG_1630_2_T.jpg') h, w, _ = temple.shape timeStart = time.time() result = cv2.matchTemplate(image=img, templ=temple, method=cv2.TM_CCOEFF) timeEnd = time.time() print("{0} = {1}".format('CPU', (timeEnd - timeStart) * 1000) + "/ms") # 配列内のグローバルな最小値と最大値を見つける minLoc=最も類似する座標 maxLoc=最も類似しない座標 minVal, maxVal, minLoc, maxLoc = cv2.minMaxLoc(result) x, y = maxLoc color = np.array([0., 255., 255.]) # BGR表記 cv2.rectangle(img=img, pt1=(x, y), pt2=(x + w, y + h), color=color, thickness=3) cv2.imshow('Final result', img) cv2.imshow('Template', temple) cv2.waitKey(0) cv2.destroyAllWindows() return 0 if __name__ == '__main__': print(cv2.__version__) __main()
~cq $ vi multimatchtemplate.py # -*- coding: utf-8 -*- import cv2 import time import numpy as np def __main(): img = cv2.imread("image/IMG_1618_2.JPG") gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) temple = cv2.imread("image/IMG_1621_T.jpg") temple = cv2.cvtColor(temple, cv2.COLOR_BGR2GRAY) h1, w1 = temple.shape timeStart = time.time() # ここから処理を実行する result = cv2.matchTemplate(gray, temple, cv2.TM_CCOEFF_NORMED) threshold = 0.8 location = np.where(result >= threshold) # 条件を満たす要素のインデックス(位置)を返す。 for x, y in zip(*location[::-1]): cv2.rectangle(img, pt1=(x, y), pt2=(x + w1, y + h1), color=(0, 255, 255), thickness=1) timeEnd = time.time() print("{0} = {1}".format('CPU', (timeEnd - timeStart) * 1000) + "/ms") cv2.imshow('res.png', img) cv2.imshow('template', temple) cv2.waitKey(0) cv2.destroyAllWindows() if __name__ == '__main__': print(cv2.__version__) __main()
~cq $ vi cascade.py # -*- coding: utf-8 -*- """ カスケード分類器 人物を探す """ import cv2 import time def __main(): img = cv2.imread('image/DSCF0769.JPG') img = getResize(img) timeStart = time.time() # ここから処理を実行する img = getPeople(img) timeEnd = time.time() print("{0} = {1}".format('CPU', (timeEnd - timeStart) * 1000) + "/ms") cv2.imshow('Final result', img) cv2.waitKey(0) cv2.destroyAllWindows() def getPeople(img): global cascade gray = cv2.cvtColor(src=img, code=cv2.COLOR_BGR2GRAY) bodyRect = cascade.detectMultiScale(image=gray, scaleFactor=1.01,minNeighbors=10) for x, y, w, h in bodyRect: cv2.rectangle(img=img, pt1=(x, y), pt2=(x + w, y + h), color=(0, 255, 255), thickness=3) return img def getResize(img): basePixSize = 1280 # 縦横で大きい辺の変更したいサイズ height = img.shape[0] width = img.shape[1] largeSize = max(height, width) # 大きい方の辺のサイズ resizeRate = basePixSize / largeSize # 変更比率を計算 img = cv2.resize(img, (int(width * resizeRate), int(height * resizeRate))) return img if __name__ == '__main__': print(cv2.__version__) cascadeFile = 'haarcascade_fullbody.xml' cascade = cv2.CascadeClassifier(cascadeFile) __main()
~cq $ vi hog.py # -*- coding: utf-8 -*- """ HoG特徴とSVM識別器 人物を探す """ import cv2 import time def __main(): img = cv2.imread('image/DSCF0769.JPG') img = getResize(img) timeStart = time.time() # ここから処理を実行する img = getPeople(img) timeEnd = time.time() print("{0} = {1}".format('CPU', (timeEnd - timeStart) * 1000) + "/ms") cv2.imshow('Final result', img) cv2.waitKey(0) cv2.destroyAllWindows() # ここから実行する def getPeople(img): gray = cv2.cvtColor(src=img, code=cv2.COLOR_BGR2GRAY) hog = cv2.HOGDescriptor() hog.setSVMDetector(svmdetector=cv2.HOGDescriptor_getDefaultPeopleDetector()) # winStride(ウィンドウの移動量) padding(入力画像の周囲の拡張範囲) human, _ = hog.detectMultiScale(img=gray, winStride=(10, 10), padding=(16, 16), scale=None) for (x, y, w, h) in human: cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 255), 3) return img def getResize(img): basePixSize = 1280 # 縦横で大きい辺の変更したいサイズ height = img.shape[0] width = img.shape[1] largeSize = max(height, width) # 大きい方の辺のサイズ resizeRate = basePixSize / largeSize # 変更比率を計算 img = cv2.resize(img, (int(width * resizeRate), int(height * resizeRate))) return img if __name__ == '__main__': print(cv2.__version__) __main()