OpenCV-Python 选择ROI
OpenCV-Python选择ROI
- 1. 矩形ROI,直接使用切片,简单粗暴
- 2. 使用OpenCV中的一些函数获取ROI区域,这个用的最多
- 3. 使用鼠标获取ROI区域
- 4. 鼠标获取多边形ROI
1. 矩形ROI,直接使用切片,简单粗暴
import cv2src = cv2.imread("D:\\python_script\\ffff\\qipan.png")
roi = src[20:150, 50:300 ]cv2.imshow('roi',roi)
cv2.waitKey(0)
cv2.destroyAllWindows()
2. 使用OpenCV中的一些函数获取ROI区域,这个用的最多
import numpy as np
from matplotlib import pyplot as plt
import cv2src = cv2.imread("D:\\python_script\\ffff\\qipan.png")ROI = np.zeros(src.shape, np.uint8) #感兴趣区域ROI
proimage0 = src.copy() #复制原图"""提取轮廓"""
proimage1=cv2.cvtColor(proimage0,cv2.COLOR_BGR2GRAY) #转换成灰度图
proimage2=cv2.adaptiveThreshold(proimage1,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY_INV,7,7)
proimage3,contours,hierarchy=cv2.findContours(proimage2,cv2.RETR_CCOMP,cv2.CHAIN_APPROX_NONE) #提取所有的轮廓"""ROI提取"""
cv2.drawContours(ROI, contours, 1,(255,255,255),-1) #ROI区域填充白色,轮廓ID1
ROI=cv2.cvtColor(ROI,cv2.COLOR_BGR2GRAY) #转换成灰度图
ROI=cv2.adaptiveThreshold(ROI,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY_INV,7,7) #自适应阈值化
imgroi= cv2.bitwise_and(ROI,proimage3) #图像交运算 ,获取的是原图处理——提取轮廓后的ROItitles = ['Original Image', 'proimage1','proimage2', 'proimage3']
images = [proimage0, proimage1, proimage2, proimage3]
for i in range(4):plt.subplot(2,2,i+1),plt.imshow(images[i],'gray')plt.title(titles[i])plt.xticks([])plt.yticks([])
plt.show()cv2.imshow('roi',roi)
cv2.imshow('imgroi',imgroi)
cv2.waitKey(0)
cv2.destroyAllWindows()
3. 使用鼠标获取ROI区域
OpenCV-python自带 API 可直接选择矩形区域作为ROI,该API位于目标追踪模块,主要是cv2.selectROI()函数
import cv2img = cv2.imread("D:\\python_script\\ffff\\qipan.png")roi = cv2.selectROI(windowName="roi", img=img, showCrosshair=True, fromCenter=False)
x, y, w, h = roicv2.rectangle(img=img, pt1=(x, y), pt2=(x + w, y + h), color=(0, 0, 255), thickness=2)
cv2.imshow("roi", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
4. 鼠标获取多边形ROI
多边形ROI,主要利用鼠标交互进行绘制:
- 单击左键,选择多边形的点;
- 单击右键,删除最近一次选择的点;
- 单击中键,确定ROI区域并可视化。
- 按”S“键,将多边形ROI区域的点保存到本地”config.pkl"文件中
import cv2
import numpy as np
import joblibpts = [] # 用于存放点# 统一的:mouse callback function
def draw_roi(event, x, y, flags, param):img2 = img.copy()if event == cv2.EVENT_LBUTTONDOWN: # 左键点击,选择点pts.append((x, y))if event == cv2.EVENT_RBUTTONDOWN: # 右键点击,取消最近一次选择的点pts.pop()if event == cv2.EVENT_MBUTTONDOWN: # 中键绘制轮廓mask = np.zeros(img.shape, np.uint8)points = np.array(pts, np.int32)points = points.reshape((-1, 1, 2))# 画多边形mask = cv2.polylines(mask, [points], True, (255, 255, 255), 2)mask2 = cv2.fillPoly(mask.copy(), [points], (255, 255, 255)) # 用于求 ROImask3 = cv2.fillPoly(mask.copy(), [points], (0, 255, 0)) # 用于 显示在桌面的图像show_image = cv2.addWeighted(src1=img, alpha=0.8, src2=mask3, beta=0.2, gamma=0)cv2.imshow("mask", mask2)cv2.imshow("show_img", show_image)ROI = cv2.bitwise_and(mask2, img)cv2.imshow("ROI", ROI)cv2.waitKey(0)if len(pts) > 0:# 将pts中的最后一点画出来cv2.circle(img2, pts[-1], 3, (0, 0, 255), -1)if len(pts) > 1:# 画线for i in range(len(pts) - 1):cv2.circle(img2, pts[i], 5, (0, 0, 255), -1) # x ,y 为鼠标点击地方的坐标cv2.line(img=img2, pt1=pts[i], pt2=pts[i + 1], color=(255, 0, 0), thickness=2)cv2.imshow('image', img2)# 创建图像与窗口并将窗口与回调函数绑定
img = cv2.imread("D:\\python_script\\ffff\\qipan.png")
cv2.namedWindow('image')
cv2.setMouseCallback('image', draw_roi)
print("[INFO] 单击左键:选择点,单击右键:删除上一次选择的点,单击中键:确定ROI区域")
print("[INFO] 按‘S’确定选择区域并保存")
print("[INFO] 按 ESC 退出")while True:key = cv2.waitKey(1) & 0xFFif key == 27:breakif key == ord("s"):saved_data = {"ROI": pts}joblib.dump(value=saved_data, filename="config.pkl")print("[INFO] ROI坐标已保存到本地.")break
cv2.destroyAllWindows()
读取获取的ROI区域
def Load_Model(filepath):img = cv2.imread("D:\\python_script\\ffff\\qipan.png")model = joblib.load(filepath)print(type(model))print(model)return modelLoad_Model('config.pkl')
OpenCV-Python 选择ROI相关推荐
- opencv 手选roi区域_【OpenCV】选择ROI区域
问题描述:在测试目标跟踪算法时,需要选择不同区域作为目标,进行目标跟踪,测试目标跟踪的效果. 解决思路: 1.OpenCV中提供了鼠标交互控制,利用setMouseCallback()给固定的窗口设置 ...
- OpenCV+python:ROI与泛洪填充
1,ROI 感兴趣区(Region of Interest,ROI) 是图像的一部分,它通过在图像上选择或使用诸如设定阈值(thresholding) 或者从其他文件(如矢量> 转换获得等方法生 ...
- ocr python opencv_如何使用(opencv/python)来实现OCR处
今天我们来介绍一下如何使用(opencv/python)来实现OCR处理银行票据.文末有代码和相关文档下载! 在第一部分中,我们将讨论两个主题: 1.首先,我们将了解MICR E-13B字体,美国,英 ...
- 学习Opencv+Python之银行卡卡号识别
学习Opencv+Python之银行卡卡号识别 思路: 获取模板轮廓 获取模板中每个数字的轮廓 获取银行卡卡号轮廓 分别提取卡号中的每个数字的轮廓 对比识别 代码: # 导入工具包 from imut ...
- pythonopencv读取图像属性_2、OpenCV Python 图像属性获取
__author__ = "WSX" import cv2 as cv import numpy as np image = cv.imread("1.JPG" ...
- OpenCV+python:Canny边缘检测算法
1,边缘处理 图像边缘信息主要集中在高频段,通常说图像锐化或检测边缘,实质就是高频滤波.我们知道微分运算是求信号的变化率,具有加强高频分量的作用. 在空域运算中来说,对图像的锐化就是计算微分.由于数字 ...
- python中import cv2遇到的错误及安装方法_独家利用OpenCV,Python和Ubidots来构建行人计数器程序(附代码amp;解析)...
作者:Jose Garcia 翻译:吴振东 校对:张一豪 本文约4000字,建议阅读14分钟. 本文将利用OpenCV,Python和Ubidots来编写一个行人计数器程序,并对代码进行了较为详细的讲 ...
- opencv python 从摄像头获取视频、帧率、分辨率等属性设置和使用
opencv python 从摄像头获取视频.帧率.分辨率等属性设置和使用 文章目录: 1,为了获取视频,你应该创建一个 VideoCapture 对象.他的参数可以是设备的索引号,或者是一个视频文件 ...
- OpenCV Python教程(3)(4)(5): 直方图的计算与显示 形态学处理 初级滤波内
OpenCV Python教程(3.直方图的计算与显示) 本篇文章介绍如何用OpenCV Python来计算直方图,并简略介绍用NumPy和Matplotlib计算和绘制直方图 直方图的背景知识.用途 ...
- 基于 OpenCV + Python 的人脸识别上课签到系统
目录 前言 安装第三方库 第一步:采集人脸图像 (1)修改姓名学号 (2)运行capture_face.py (3)采集人脸图像 (4)查看采集到的人脸图像 第二步:训练模型 第三步:识别签到 (1) ...
最新文章
- python中的h5py开源库的使用
- window系统查看端口被哪个进程占用了
- php加mySQL制作网络硬盘_PHP实现的简单网络硬盘
- CXF学习(2) helloworld
- 700 页的机器学习总结火了!
- Educational Codeforces Round 68 (Rated for Div. 2)-D. 1-2-K Game
- SEO人员,不要见风是雨
- 小米路由器3c 虚拟服务器,小米路由器怎么设置_小米路由器3c设置教程-WIFI之家...
- 在三维空间中表示平面和直线
- 华为方会提供一份CRS(客户需求)和SOW(工作任务书)
- pycharm无法创建虚拟环境Virtualenv(Directory ...\python not found)
- 超人说我最叼蝙蝠侠笑了 超级英雄战力排名
- 用当下的力量共创未来——2017(第十五届)中国互联网经济论坛盛典
- UE4中VR项目的打包和发布
- html里面链接,html – 链接里面的一个链接
- 打印机墨水添加方法(二)
- linux怎么上网登录窗,Debian的登录窗口和inkscape的使用
- 仿西祠和搜狐论坛界面的bbs下载
- 腾讯云实时音视频带你玩转语音聊天室
- Android 判断手机设备是否是小米,华为,魅族设备