Open CVで作業をするとき毎回忘れてそのたびに解決策を探す小ネタの一つに上のものがある。
結構面倒なので毎回ゲンナリしてしばらくやる気を失いがちなのでこれ以上繰り返さないために書く。
pythonです。
結論はこれ
import cv2
import numpy as np
def cutByPoints(src_img,poly):
mytest=cv2.cvtColor(src_img,cv2.COLOR_BGR2BGRA)#アルファ追加
mask = np.zeros_like(mytest) #全画素透過
mask = cv2.fillPoly(mask, [np.array(poly)], color=(255, 255, 255,255))#図=白 背景=透明
masked_src_img00 = np.where(mask==255, mytest, mask)#図=元画像 背景=透明
minx=-1
miny=-1
maxx=-1
maxy=-1
leng=len(poly)
for i in range(leng):
if i==0:
minx=poly[i][0]
maxx=poly[i][0]
miny=poly[i][1]
maxy=poly[i][1]
else :
if minx>poly[i][0]:
minx=poly[i][0]
if maxx<poly[i][0]:
maxx=poly[i][0]
if miny>poly[i][1]:
miny=poly[i][1]
if maxy<poly[i][1]:
maxy=poly[i][1]
resimg=masked_src_img00[miny : maxy, minx : maxx]
return resimg
これ以上googleしないために書いた
使い方はこんな感じ
src_img = cv2.imread("/home/kokawa2003/ピクチャ/kyBXv.png")#元画像
#座標(星の右半分)
poly= [
[200, 0],
[260, 160],
[400, 160],
[300, 240],
[400, 400],
[200, 320],
]
img_bool=cutByPoints(src_img,poly)
cv2.imwrite("./masked_crop.png", img_bool)