10-6FindCircle_gpu.py

000: import cv2
001: import numpy as np
002:
003: def __main():
004: img = cv2.imread(‘IMG_1610.JPG’)
005:
006: cuImg = getGpuResize(img)
007: img = cuImg.download()
008:
009: dst = getGpuCircles(cuImg, img)
010:
011: cv2.imshow(“Final result”, dst)
012: cv2.waitKey(0)
013: cv2.destroyAllWindows()
014:
015: def getGpuResize(src):
016:
017: global gpuImg
018: basePixSize = 1280 # 縦横で大きい辺の変更したいサイズ
019: height = src.shape[0]
020: width = src.shape[1]
021:
022: largeSize = max(height, width) # 大きい方の辺のサイズ
023: resizeRate = basePixSize / largeSize # 変更比率を計算
024:
025: gpuImg.upload(src)
026: gpuDst = cv2.cuda.resize(gpuImg, (int(width * resizeRate), int(height * resizeRate)))
027:
028: return gpuDst
029:
030: def getGpuCircles(gpuSrc, src):
031: gpuSrc = cv2.cuda.cvtColor(gpuSrc, cv2.COLOR_BGR2GRAY)
032: # ガウシアンフィルタ
033: ksize = (25, 25) # 正の奇数で指定する(ここの数字を変えると効果が変更できる)
034: # フィルターの実行
035: gpuFilter = cv2.cuda.createGaussianFilter(srcType=cv2.CV_8UC1, dstType=cv2.CV_8UC1, ksize=ksize, sigma1=0, sigma2=0)
036: gpuSrc = cv2.cuda_Filter.apply(gpuFilter, gpuSrc)
037: ret, gpuSrc = cv2.cuda.threshold(gpuSrc, 100, 255, cv2.THRESH_BINARY)
038:
039: # 円を検知した座標を取得する
040: #cv2.HoughCircles(image=gray, method=cv2.HOUGH_GRADIENT, dp=1, minDist=20, param1=100, param2=20, minRadius=None, maxRadius=None)
041: detector = cv2.cuda.createHoughCirclesDetector(dp=1, minDist=20, cannyThreshold=100, votesThreshold=20, minRadius=20, maxRadius=120)
042: cuCircles = detector.detect(gpuSrc)
043: circles = cuCircles.download()
044: if circles is not None:
045: circles = np.uint0(np.around(circles))
046: for circle in circles[0, :]:
047: # 元画像に取得した座標の円を描画する
048: dst = cv2.circle(src, (circle[0], circle[1]), circle[2], (255, 0, 255), 2)
049:
050: return dst
051:
052: if __name__ == ‘__main__’:
053: print(cv2.__version__)
054:
055: gpuImg = cv2.cuda_GpuMat()
056: __main()