前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站:前言 – 人工智能教程
目录
安装opencv
其中,opencv-python只包含了OpenCV的主要模块,而opencv-contrib-python还包含了一些拓展模块,两者都适用于桌面环境,而opencv-python-headless是用于服务器环境的无头软件包,无UI界面,看需求安装即可。
pip install opencv-python
这个安装没有智能提示
这个好像没有最新版:
https://www.lfd.uci.edu/~gohlke/pythonlibs/
pypi有最新版,下载很慢,可以用迅雷下载,很快。
跟踪根据id分配颜色:
def get_color(idx):
idx = idx * 5
color = ((37 * idx) % 255, (17 * idx) % 255, (29 * idx) % 255)
return color
改变窗口大小:
c++:
创建窗口时候改变下参数就可以鼠标随意拖动窗口改变大小啦
cv::namedWindow("camera", CV_WINDOW_NORMAL);//CV_WINDOW_NORMAL就是0
cv::imshow("camera", frame);
python:
imgpath=r"d:/20200708002140.jpg"
width=1200
height=800
img=cv2.imread(imgpath)
cv2.namedWindow("canny", 0)
cv2.resizeWindow("canny", 300, 300) # 设置窗口大小
cv2.imshow("canny", img)
cv2.waitKey()
移动位置
imgpath=r"d:/20200708002140.jpg"
width=1200
height=800
img=cv2.imread(imgpath)
cv2.namedWindow('image', cv2.WINDOW_NORMAL)
# 改变窗口位置:left top
cv2.moveWindow("image", 1000, 100)
#改变窗口位置:left top
cv2.imshow("image", img)
cv2.waitKey()
选取矩形ROI
OpenCV自带 API 可直接选择矩形区域作为ROI,该API位于目标追踪模块,主要是cv2.selectROI()函数。
import cv2
import imutils
img = cv2.imread("./test_image.jpg")
img = imutils.resize(img, width=500)
roi = cv2.selectROI(windowName="roi", img=img, showCrosshair=True, fromCenter=False)
x, y, w, h = roi
cv2.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()
选取多边形ROI
多边形ROI,主要利用鼠标交互进行绘制:
1. 单击左键,选择多边形的点;
2. 单击右键,删除最近一次选择的点;
3. 单击中键,确定ROI区域并可视化。
4. 按”S“键,将多边形ROI区域的点保存到本地”config.pkl"文件中。
import cv2
import numpy as np
import joblib
pts = [] # 用于存放点
select_ok = False
def draw_roi(event, x, y, flags, param):
img2 = img.copy()
global select_ok
if event == cv2.EVENT_LBUTTONDOWN: # 左键点击,选择点
if select_ok:
pts.clear()
pts.append((x, y))
select_ok = False
if event == cv2.EVENT_RBUTTONDOWN: # 右键点击,取消最近一次选择的点
select_ok = True
if (event == cv2.EVENT_LBUTTONDBLCLK):
select_ok=True
if event == cv2.EVENT_MBUTTONDOWN: # 中键绘制轮廓
pts.pop()
if select_ok:
mask = np.zeros(img.shape, np.uint8)
points = np.array(pts, np.int32)
# saved_data = {"ROI": pts}
joblib.dump(value=points, filename=pkl_file)
print('select ok points')
print(points)
# 画多边形
img2 = cv2.polylines(img2, [points], True, (0, 255, 0), 2)
# cv2.imshow('mask', mask)
elif len(pts) > 0:
# img2=cv2.polylines(img2, [np.array(pts, np.int32)], True, (255, 0, 255), 2)
for i in range(len(pts)):
cv2.circle(img2, pts[i],3, (255, 0, 255), -1) # x ,y 为鼠标点击地方的坐标
if i<len(pts)-1:
cv2.line(img=img2, pt1=pts[i], pt2=pts[i + 1], color=(255, 0, 255), thickness=2)
cv2.imshow('image', img2)
# 创建图像与窗口并将窗口与回调函数绑定
# img = cv2.imread("./zhai_first.jpg")
# img = cv2.imread("./nuohua_first.jpg")
img = cv2.imread("d:/caoyuan.jpg")
pkl_file="zhai_config.pkl"
cv2.namedWindow('image')
cv2.setMouseCallback('image', draw_roi)
print("[INFO] 单击左键:选择ROI点,单击右键:选择完毕,单击中键:撤销一步")
print("[INFO] 按 ESC 退出")
# while True:
key = cv2.waitKey(0) & 0xFF
print("select end----")
if len(pts) > 0:
print("ok")
if key == 27:
print("stop")
cv2.destroyAllWindows()
读取config.pkl:
model1 = joblib.load(filename="config.pkl")
print(model1)
没有选择完毕时,都画时,会出现意想不到的情况:
import cv2
import numpy as np
import joblib
pts = [] # 用于存放点
# 统一的:mouse callback function
def draw_roi(event, x, y, flags, param):
img2 = img.copy()
select_ok=False
if event == cv2.EVENT_LBUTTONDOWN: # 左键点击,选择点
pts.append((x, y))
if event == cv2.EVENT_RBUTTONDOWN: # 右键点击,取消最近一次选择的点
select_ok = True
if (event == cv2.EVENT_LBUTTONDBLCLK):
select_ok=True
if event == cv2.EVENT_MBUTTONDOWN: # 中键绘制轮廓
pts.pop()
if select_ok:
mask = np.zeros(img.shape, np.uint8)
points = np.array(pts, np.int32)
print(points)
# saved_data = {"ROI": pts}
joblib.dump(value=points, filename=pkl_file)
print('select ok points',points)
# 画多边形
# mask = cv2.polylines(img, [points], True, (255, 0, 255), 2)
# cv2.imshow('mask', mask)
if len(pts) > 0:
img2=cv2.polylines(img, [np.array(pts, np.int32)], True, (255, 0, 255), 2)
for i in range(len(pts)):
cv2.circle(img2, pts[i],3, (255, 0, 255), -1) # x ,y 为鼠标点击地方的坐标
# if i<len(pts)-1:
# cv2.line(img=img2, pt1=pts[i], pt2=pts[i + 1], color=(255, 0, 255), thickness=2)
cv2.imshow('image', img2)
# 创建图像与窗口并将窗口与回调函数绑定
# img = cv2.imread("./zhai_first.jpg")
img = cv2.imread("./nuohua_first.jpg")
pkl_file="zhai_config.pkl"
cv2.namedWindow('image')
cv2.setMouseCallback('image', draw_roi)
print("[INFO] 单击左键:选择点,单击右键:删除上一次选择的点,单击中键:确定ROI区域")
print("[INFO] 按 ESC 退出")
# while True:
key = cv2.waitKey(0) & 0xFF
print("select end----")
if len(pts) > 0:
print("ok")
if key == 27:
print("stop")
cv2.destroyAllWindows()
画的螺旋状:
绘制图形
以下内容转自:
OpenCV入门(26):矩形、圆形、扇形及任意多边形的绘制_Home丶Basic的博客-优快云博客_opencv 扇形
import cv2
import numpy as np
newImageInfo = (500,500,3)
dst = np.zeros(newImageInfo,np.uint8)
# 绘制矩形 1.目标图片 2.左上角 3.右下角 4.颜色 5.内容是否填充(-1:填充; 》0的值:线条宽度)
cv2.rectangle(dst,(50,100),(200,300),(255,0,0),-1)
# 绘制圆形 1.目标图片 2.圆心 3.半径 4.颜色 5.是否填充
cv2.circle(dst,(250,250),80,(0,255,0),2)
# 绘制扇形 1.目标图片 2.椭圆圆心 3.长短轴长度 4.偏转角度 5.圆弧起始角度 6.终止角度 7.颜色 8.是否填充
cv2.ellipse(dst,(256,256),(150,100),0,0,145,(255,255,0),-1)
# 绘制任意多边形
points = np.array([[150,50],[140,140],[200,170],[250,250],[150,50]],np.int32)
# print(points.shape)# --->(5, 2)
points = points.reshape((-1,1,2))
# print(points.shape)# --->(5, 1, 2)
cv2.polylines(dst,[points],True,(0,255,255))
cv2.imshow('dst',dst)
cv2.waitKey(0)
绘制圆扇形
# 绘制圆形扇形 1.目标图片 2.椭圆圆心 3.长短轴长度 4.偏转角度 5.圆弧起始角度 6.终止角度 7.颜色 8.是否填充 cv2.ellipse(dst,(256,256),(150,150),0,0,-45,(255,255,0),0)