10-8FindContours_gpu.py

000: import cv2
001: import numpy as np
002:
003: def __main():
004: global gpuDst
005: img = cv2.imread(‘IMG_1610.JPG’)
006:
007: timeStart = time.time()
008: gpuDst = getGpuResize(img)
009: dst = getGpuFindContours(gpuDst)
010: timeEnd = time.time()
011: print(“{0} = {1}”.format(‘GPU’, (timeEnd – timeStart) * 1000) + “/ms”)
012:
013: cv2.imshow(“Final result”, dst)
014: cv2.waitKey(0)
015: cv2.destroyAllWindows()
016:
017: def getGpuResize(src):
018: global gpuImg
019:
020: gpuImg.upload(src)
021:
022: basePixSize = 1280 # 縦横で大きい辺の変更したいサイズ
023: height = src.shape[0]
024: width = src.shape[1]
025:
026: largeSize = max(height, width) # 大きい方の辺のサイズ
027: resizeRate = basePixSize / largeSize # 変更比率を計算
028: gpuImg = cv2.cuda.resize(gpuImg, (int(width * resizeRate), int(height * resizeRate)))
029:
030: return gpuImg
031:
032: def getGpuFindContours(cuSrc):
033:
034: img = cuSrc.download()
035: cuSrc = cv2.cuda.cvtColor(cuSrc, cv2.COLOR_BGR2GRAY) # グレースケールに変換する
036: # ガウシアンフィルタ
037: ksize = (25, 25) # 正の奇数で指定する(ここの数字を変えると効果が変更できる)
038: # フィルターの実行
039: filter = cv2.cuda.createGaussianFilter(srcType=cv2.CV_8UC1, dstType=cv2.CV_8UC1, ksize=ksize, sigma1=0, sigma2=0)
040: cuSrc = cv2.cuda_Filter.apply(filter, cuSrc)
041:
042: ret, cuSrc = cv2.cuda.threshold(cuSrc, 98, 255, cv2.THRESH_BINARY) # グレースケールを二値化する
043: dst = cuSrc.download()
044: # ここで処理を実行
045: contours, _ = cv2.findContours(image=dst, mode=cv2.RETR_TREE, method=cv2.CHAIN_APPROX_SIMPLE) # 輪郭の検出
046: result = cv2.drawContours(image=img, contours=contours, contourIdx=-1, color=(0, 0, 255), thickness=2, lineType=cv2.LINE_AA) # 輪郭の描画
047:
048: cv2.imshow(‘Result’, result)
049:
050: for i, cont in enumerate(contours):
051: rect = cv2.minAreaRect(cont) # 四角く括れるエリアを探す//角度のついた長方形の値が戻る
052: box = cv2.boxPoints(rect) # 上記エリアを長方形座標に変換する
053: box = np.int0(box)
054: dst = cv2.drawContours(image=result, contours=[box], contourIdx=0, color= (255, 255, 0), thickness=2, lineType=cv2.LINE_AA) # 長方形を描画する
055: cv2.ellipse(dst, rect, (0, 255, 255), 2) # 楕円を描画する
056:
057: return dst
058:
059: if __name__ == ‘__main__’:
060: print(cv2.__version__)
061:
062: gpuImg = cv2.cuda_GpuMat()
063: gpuDst = cv2.cuda_GpuMat()
064:
065: __main()