添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
# 获取轮廓 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 标签 , 发表评论 on 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 标签 , 发表评论 on 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 标签 , 发表评论 on 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 标签 , 发表评论 on 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 标签 , 发表评论 on 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 标签 , 发表评论 on 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 标签 , 发表评论 on OpenCV-Python 保存视频帧