1、 get_area_points:用来标记特定区域的顶点,按下空格键表示标定完成一个区域,按下enter键表示所有区域标定完成(标记鼠标点击时,要按逆时针或者顺时针顺序标记)
2、GetArea:用get_area_points生成的顶点列表生成掩膜
3、如果想继续得到掩膜画出的区域,只要让原图像和掩膜 按位与 操作即可得到
get_area_points函数代码:
"""
@Author : C
@Time : 2021/12/29 9:22
@FileName : GetPoint.py
@Function :
"""
import cv2
def get_area_points(img):
count = 1
a = []
b = []
Points = []
Points_list = [] # 用来放不同的数据
def on_EVENT_LBUTTONDOWN(event, x, y, flags, param):
if event == cv2.EVENT_LBUTTONDOWN:
# 得到一个字符串
xy = "%d,%d" % (x, y)
a.append(x)
b.append(y)
# 输出颜色
print('颜色' + str(img[y, x, 0]) + ' ' + str(img[y, x, 1]) + ' ' + str(img[y, x, 2]))
# 标记
cv2.circle(img, (x, y), 1, (0, 0, 255), thickness=-1) # 绘圆点
# 标记坐标
cv2.putText(img, xy, (x, y), cv2.FONT_HERSHEY_PLAIN, 1.0, (0, 0, 255), thickness=1)
# 再次展示图片
cv2.imshow("{}.jpg".format(count), img)
# 将点放入列表
Points.append([a[-1], b[-1]])
print(a[-1], b[-1])
while True:
# 创建窗口
cv2.namedWindow("{}.jpg".format(count), cv2.WINDOW_NORMAL)
cv2.resizeWindow("{}.jpg".format(count), 960, 540)
cv2.moveWindow("{}.jpg".format(count), 100, 100)
# cv2.setWindowProperty("{}.jpg".format(count), cv2.WND_PROP_FULLSCREEN, cv2.WINDOW_FULLSCREEN)
# 设置回调函数
cv2.setMouseCallback("{}.jpg".format(count), on_EVENT_LBUTTONDOWN)
# 展示图片
cv2.imshow("{}.jpg".format(count), img)
# 等待按键,按下空格键表示标记完成一个区域,按下enter键表示所有区域标记完成
flag = cv2.waitKey()
# 空格键表示下一个区域
if flag == 32:
if Points: # 列表不为空
Points_list.append(Points)
Points = []
# Enter键表示结束
if flag == 13:
if Points:
Points_list.append(Points)
break
return Points_list
if __name__ == '__main__':
path = r"D:\cycFeng\Data\20211220\Yuce\01frame75.jpg"
img = cv2.imread(path)
Pts_list = get_area_points(img)
print('o.o')
# FileName = r"D:\cycFeng\Data\20211220\Yuce\Point.txt" # Point.txt
# if os.path.exists(FileName): # 如果文件存在
# os.remove(FileName)
# file = open(FileName, 'w') # 新建文件
GetArea函数:
"""
@Author : c
@Time : 2021/11/3 17:00
@FileName : cycJieTu.py
@Function :
"""
import cv2
import numpy as np
from Tool.GetPoint import get_area_points
def GetArea(img1):
# 创建掩膜
Mask1 = np.zeros(img1.shape, dtype='uint8')
# 找到顶点列表
Pts_list = get_area_points(img1)
# 填充
for Pts in Pts_list:
Pts = np.array(Pts)
cv2.fillPoly(Mask1, [Pts], (255, 255, 255))
# 返回掩膜
return Mask1
if __name__ == '__main__':
# 输入图片地址和保存图片地址
imgPath = r"D:\ma.jpg"
SavePath = r"D:\ma_mask.jpg"
# 是否保存
isSave = False
# 读取图片,得到掩膜
img = cv2.imread(imgPath)
Mask = GetArea(img.copy())
# 展示
cv2.namedWindow('mask', cv2.WINDOW_NORMAL)
cv2.resizeWindow('mask', 960, 540)
cv2.moveWindow('mask', 100, 100)
cv2.imshow('mask', Mask)
cv2.waitKey()
# 是否保存
if isSave:
cv2.imwrite(SavePath, Mask)
# 掩膜变成灰度图
Mask = cv2.cvtColor(Mask, cv2.COLOR_RGB2GRAY)
img_mask = cv2.bitwise_and(img, img, mask=Mask)
cv2.namedWindow('img_mask', cv2.WINDOW_NORMAL)
cv2.resizeWindow('img_mask', 960, 540)
cv2.moveWindow('img_mask', 100, 100)
cv2.imshow('img_mask', img_mask)
cv2.waitKey()