# 获取轮廓
ret, thresh = cv.threshold(imgray,127,255,0)
contours, hierarchy = cv.findContours(thresh, cv.RETR_TREE,cv.CHAIN_APPROX_SIMPLE)
# 注释以下代码,或 调整数值 “0.1” 以获得不同的精度
epsilon = 0.01*cv.arcLength(contours[0],True)
contours = cv.approxPolyDP(contours[0],epsilon,True)
cv.drawContours(im,contours, -1,(0,255,0),3)
cv.imshow('result',im)
cv.waitKey(0)
# 释放资源
cv.destroyAllWindows()
示例代码打包下载:
参考原文:https://docs.opencv.org/4.5.5/dd/d49/tutorial_py_contour_features.html
分类:
OpenCV
Python
标签
OpenCV
,
Python
# 获取轮廓
ret, thresh = cv.threshold(imgray,127,255,0)
contours, hierarchy = cv.findContours(thresh, cv.RETR_TREE,cv.CHAIN_APPROX_SIMPLE)
cv.drawContours(im,contours, -1,(0,255,0),3)
cv.imshow('result',im)
cv.waitKey(0)
# 释放资源
cv.destroyAllWindows()
>>> green = np.uint8([[[0,255,0 ]]])
>>> hsv_green = cv.cvtColor(green,cv.COLOR_BGR2HSV)
>>> print( hsv_green )
[[[ 60 255 255]]]
参考原文:https://docs.opencv.org/4.5.5/df/d9d/tutorial_py_colorspaces.html
分类:
OpenCV
Python
标签
OpenCV
,
Python
# 我希望把 LOGO 防止到左上角,所以创建了一个区域(roi)
rows,cols,channels = img2.shape
roi = img1[0:rows, 0:cols]
# 将 LOGO 图转换为灰度图,阈值为 10, 最大值为 255
img2gray = cv.cvtColor(img2,cv.COLOR_BGR2GRAY)
ret, mask = cv.threshold(img2gray, 10, 255, cv.THRESH_BINARY)
mask_inv = cv.bitwise_not(mask)
# 现在将 ROI 抠出黑色区域
img1_bg = cv.bitwise_and(roi,roi,mask = mask_inv)
# 抠出 LOGO 图像
img2_fg = cv.bitwise_and(img2,img2,mask = mask)
# 将抠出的 LOGO 防入 ROI 区域中
dst = cv.add(img1_bg,img2_fg)
img1[0:rows, 0:cols ] = dst
# 显示图像
cv.imshow('res',img1)
# 退出,并释放资源
cv.waitKey(0)
cv.destroyAllWindows()
本文示例完整代码下载;
分类:
OpenCV
Python
标签
OpenCV
,
Python
# 创建 3 个分别代表 RGB 的轨迹栏控件
cv.createTrackbar('R','image',0,255,nothing)
cv.createTrackbar('G','image',0,255,nothing)
cv.createTrackbar('B','image',0,255,nothing)
# 创建一个代表开关的 轨迹栏控件
switch = '0 : OFF \n1 : ON'
cv.createTrackbar(switch, 'image',0,1,nothing)
while(1):
cv.imshow('image',img)
k = cv.waitKey(1) & 0xFF
if k == 27:
break
# 获取 4 个轨迹栏控件的当前位置
r = cv.getTrackbarPos('R','image')
g = cv.getTrackbarPos('G','image')
b = cv.getTrackbarPos('B','image')
s = cv.getTrackbarPos(switch,'image')
if s == 0:
img[:] = 0
else:
img[:] = [b,g,r]
# 程序退出,释放资源
cv.destroyAllWindows()
以上代码即完整代码,Copy 运行即可得到相同的结果。
分类:
OpenCV
Python
标签
OpenCV
,
Python
def draw_circle(event,x,y,flags,param):
# 当鼠标左键双击时,绘制一个蓝色的圆到窗口中
if event == cv.EVENT_LBUTTONDBLCLK:
cv.circle(img,(x,y),100,(255,0,0),-1)
# 创建一个黑色背景的窗口
img = np.zeros((512,512,3), np.uint8)
cv.namedWindow('image')
cv.setMouseCallback('image',draw_circle)
while(1):
cv.imshow('image',img)
# 按下 Esc 时,退出程序
if cv.waitKey(20) & 0xFF == 27:
break
# 当程序结束时,释放资源
cv.destroyAllWindows()
现在我们寻求一个更好的应用程序。在此,我们像在 Paint 应用程序中一样通过拖动鼠标来绘制矩形或圆形(取决于我们选择的模式)。所以我们的鼠标回调函数有两部分,一是绘制矩形,二是绘制圆形。这个具体的例子将非常有助于创建和理解一些交互式应用程序,如对象跟踪、图像分割等。
def draw_circle(event,x,y,flags,param):
global ix,iy,drawing,mode
if event == cv.EVENT_LBUTTONDOWN:
drawing = True
ix,iy = x,y
elif event == cv.EVENT_MOUSEMOVE:
if drawing == True:
if mode == True:
cv.rectangle(img,(ix,iy),(x,y),(0,255,0),-1)
else:
cv.circle(img,(x,y),5,(0,0,255),-1)
elif event == cv.EVENT_LBUTTONUP:
drawing = False
if mode == True:
cv.rectangle(img,(ix,iy),(x,y),(0,255,0),-1)
else:
cv.circle(img,(x,y),5,(0,0,255),-1)
# 创建一个黑色背景图像的窗口
img = np.zeros((512,512,3), np.uint8)
cv.namedWindow('image')
cv.setMouseCallback('image',draw_circle)
while(1):
cv.imshow('image',img)
# 按下 Esc 退出程序
k = cv.waitKey(1) & 0xFF
# 按下 m 键,切换绘图模式
if k == ord('m'):
mode = not mode
elif k == 27:
break
# 程序退出时,释放资源
cv.destroyAllWindows()
以上代码为完整代码, Copy 运行即可得到相同的结果。
附加说明:以上代码在 Windows 中运行正常,如果您使用的场景为 Mac + 触摸板,则需要更改相应的鼠标捕获事件。
分类:
OpenCV
Python
标签
OpenCV
,
Python
# 绘制一个 5px 的蓝色线条
# 要绘制一条线,您需要传递线的起点和终点坐标。我们将创建一个黑色图像并在其上从左上角到右下角画一条蓝线。
cv.line(img,(0,0),(511,511),(255,0,0),5)
# 绘制一个矩形
# 要绘制矩形,您需要矩形的左上角和右下角。这次我们将在图像的右上角绘制一个绿色矩形。
cv.rectangle(img,(384,0),(510,128),(0,255,0),3)
# 绘制一个圆
# 要画一个圆,你需要它的中心坐标和半径。我们将在上面绘制的矩形内画一个圆圈。
cv.circle(img, (447,63), 63, (0,0,255), -1)
# 绘制一个椭圆
# 要绘制椭圆,我们需要传递几个参数。一个参数是中心位置 (x,y)。下一个参数是轴长度(长轴长度,短轴长度)。
# angle 是椭圆沿逆时针方向旋转的角度。startAngle 和 endAngle 表示从主轴顺时针方向测量的椭圆弧的起点和终点。
# 即给出值 0 和 360 给出完整的椭圆。有关更多详细信息,请查看cv.ellipse()的文档。下面的示例在图像的中心绘制一个半椭圆。
cv.ellipse(img, (256,256), (100,50), 0,0,180, 255, -1)
# 绘制多边形
# 要绘制多边形,首先需要顶点坐标。将这些点放入一个形状为 ROWSx1x2 的数组中,
# 其中 ROWS 是顶点数,它应该是 int32 类型。在这里,我们用黄色绘制一个带有四个顶点的小多边形。
pts = np.array([[10,5],[20,30],[70,20],[50,10]], np.int32)
pts = pts.reshape((-1,1,2))
cv.polylines (img,[pts], True ,(0,255,255))
# 绘制文本
font = cv.FONT_HERSHEY_SIMPLEX
cv.putText(img, 'OpenCV', (10,500), font, 4, (255,255,255), 2, cv.LINE_AA)
# 显示绘制结果到窗口中
cv.imshow('绘制结果展示',img)
cv.waitKey(0)
以上为本文的完整代码,直接运行即可实现本文所展示的效果。
本示例参考官方原文:https://docs.opencv.org/4.5.5/dc/da5/tutorial_py_drawing_functions.html
分类:
OpenCV
Python
标签
OpenCV
,
Python
width = int(cap.get(cv.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv.CAP_PROP_FRAME_HEIGHT))
# 定义编解码器并创建 VideoWriter 对象
fourcc = cv.VideoWriter_fourcc(*'XVID')
out = cv.VideoWriter('output.avi', fourcc, 20.0, (width, height))
# 处理视频
while cap.isOpened():
ret, frame = cap.read()
if not ret:
print('无法收到视频帧数据(该视频流是否已结束?),程序正在退出')
break
# 将每一帧视频进行翻转处理,并写入
frame = cv.flip(frame, 0)
out.write(frame)
cv.imshow('frame', frame)
if cv.waitKey(1) == ord('q'):
break
# 程序结束时,释放资源
cap.release()
out.release()
cv.destroyAllWindows()
本示例直接运行以上代码即可(以上即完整代码)
示例参考原文:https://docs.opencv.org/4.5.5/dd/d43/tutorial_py_video_display.html
分类:
OpenCV
Python
标签
OpenCV
,
Python