python opencv 选定图中特定区域,制作掩膜

1、 get_area_points:用来标记特定区域的顶点,按下空格键表示标定完成一个区域,按下enter键表示所有区域标定完成(标记鼠标点击时,要按逆时针或者顺时针顺序标记)
2、GetArea:用get_area_points生成的顶点列表生成掩膜
3、如果想继续得到掩膜画出的区域,只要让原图像和掩膜 按位与 操作即可得到

效果:
python opencv 选定图中特定区域,制作掩膜_第1张图片
得到掩膜区域
python opencv 选定图中特定区域,制作掩膜_第2张图片

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()

你可能感兴趣的:(python,opencv,python,计算机视觉,得到掩膜)