9-2Comb_Mask_gpu.py

000: import cv2
001: import numpy as np
002:
003: def __main():
004: img = cv2.imread(‘../IMG_0260.JPG’)
005: dst = cv2.imread(‘../IMG_0181.JPG’)
006: mask = baseImage(img)
007:
008: gpuImg = cv2.cuda_GpuMat()
009: gpuDst = cv2.cuda_GpuMat()
010: gpuMsk = cv2.cuda_GpuMat()
011: # GPUメモリへ転送
012: gpuImg.upload(img)
013: gpuDst.upload(dst)
014: gpuMsk.upload(mask)
015:
016: gpuImg = getGpuResize(gpuImg)
017: gpuDst = getGpuResize(gpuDst)
018: gpuMsk = getGpuResize(gpuMsk)
019: # ここで処理を実行
020: gpuImgMask = getGpuMaskImg(gpuImg, gpuDst, gpuMsk)
021:
022: # GPUメモリから戻す
023: imgMask = gpuImgMask.download()
024:
025: # cv2.imshow(‘Original’, org)
026: # cv2.imshow(‘Mask’, mask)
027: cv2.imshow(‘Final result’, imgMask)
028: cv2.waitKey(0)
029: cv2.destroyAllWindows()
030:
031: # マスク合成
032: def getGpuMaskImg(gpuImg, gpuDst, gpuMsk):
033: gpuMsk = cv2.cuda.cvtColor(gpuMsk, cv2.COLOR_BGR2GRAY)
034:
035: gpuImg = cv2.cuda.bitwise_not(gpuImg)
036: gpuDst = cv2.cuda.bitwise_not(gpuImg, gpuDst, gpuMsk)
037:
038: return gpuDst
039:
040:
041: def getGpuResize(gpuImg):
042: basePixSize = 1000 # 縦横で大きい辺の変更したいサイズ
043: width, height = gpuImg.size()
044:
045: largeSize = max(height, width) # 大きい方の辺のサイズ
046: resizeRate = basePixSize / largeSize # 変更比率を計算
047:
048: gpuImg = cv2.cuda.resize(gpuImg, (int(width * resizeRate), int(height * resizeRate)))
049:
050: return gpuImg
051:
052: # 画像を抜き取るためのマスク画
053: def baseImage(img):
054: height = img.shape[0]
055: width = img.shape[1]
056: size = np.array([height, width, 3]) # 縦heightピクセル 横widthピクセル 1チャンネル
057: img = np.zeros(size, dtype=np.uint8)
058: centerX = int(width / 2)
059: centerY = int(height / 2)
060: w = int(centerX * 0.6)
061: h = int(centerY * 0.6)
062: color = np.array([255., 255., 255.])
063: cv2.ellipse(img=img, center=(centerX, centerY), axes=(w, h), angle=0, startAngle=0, endAngle=360, color=color,
064: thickness=-1, lineType=cv2.LINE_AA)
065:
066: return img
067:
068: if __name__ == ‘__main__’:
069: print(cv2.__version__)
070:
071: __main()