news 2026/7/4 4:37:13

OpenCV入门

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
OpenCV入门

掩码 图像分割

img=cv2.imread("test.png")mask=np.zeros(img.shape,dtype=np.uint8)cv2.circle(mask,(200,300),#圆心坐标150,#半径(255,255,255),#填充的颜色-1)#线条大小 -1 代表实心seg_img=cv2.bitwise_and(img,#原图mask#掩码图像)cv2.imshow('seg',seg_img)cv2.waitKey()

原图

分割后的效果图

颜色检测

importcv2importnumpyasnpdefMoveTrackbarProc(pos):print(pos)img=cv2.imread("33.png")#转换为RGB模式转换为HSV模式 HSV模式更容易实现颜色的过滤hsvimg=cv2.cvtColor(img,cv2.COLOR_BGR2HSV)windowname='trawindow'cv2.namedWindow(windowname)cv2.resizeWindow(windowname,300,300)cv2.createTrackbar('h_min',#创建的滑动条名字windowname,0,# 色调最小值179,#Hue 色调的最大值179MoveTrackbarProc)#滑动条所属窗口cv2.createTrackbar('h_max',windowname,179,179,MoveTrackbarProc)#饱和度cv2.createTrackbar('sat_min',windowname,0,255,MoveTrackbarProc)cv2.createTrackbar('sat_max',windowname,255,255,MoveTrackbarProc)#亮度cv2.createTrackbar('val_min',windowname,0,255,MoveTrackbarProc)cv2.createTrackbar('val_max',windowname,255,255,MoveTrackbarProc)whileTrue:h_min=cv2.getTrackbarPos('h_min',windowname)h_max=cv2.getTrackbarPos('h_max',windowname)sat_min=cv2.getTrackbarPos('sat_min',windowname)sat_max=cv2.getTrackbarPos('sat_max',windowname)val_min=cv2.getTrackbarPos('val_min',windowname)val_max=cv2.getTrackbarPos('val_max',windowname)#对颜色进行过滤 颜色值在设置的范围内 值设置白色 没有在范围内的设置为黑色 得到一个掩码图像mask=cv2.inRange(hsvimg,#过滤的图像np.array([h_min,sat_min,val_min]),np.array([h_max,sat_max,val_max]))seg_img=cv2.bitwise_and(img,img,mask=mask)cv2.imshow('mask',mask)cv2.imshow('set_img',seg_img)cv2.imshow('img',img)cv2.waitKey(20)

轮廓检测

importcv2importnumpyasnp img=cv2.imread("txjc.png")#彩色图像转换为灰度图像 轮廓识别的时候不需要彩色 减少数据运算量gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#边缘检测 threshold1(低阈值)→ 控制"灵敏度"# 值越小 → 检测到越多边缘(包括噪点)# 值越大 → 只保留明显的边缘# threshold2(高阈值)→ 控制"筛选强度"# 值越小 → 保留更多弱边缘# 值越大 → 只保留强边缘canny=cv2.Canny(gray,100,200)#轮廓检测 返回值1 检测到的轮廓 返回值2 轮廓的层级Contours,_=cv2.findContours(canny,cv2.RETR_EXTERNAL,#返回最外面的边框cv2.CHAIN_APPROX_NONE#保存返回的所有轮廓点)forcontourinContours:cv2.drawContours(img,contour,-1,#轮廓id -1代表这个图形所有的轮廓(100,100,100),#轮廓颜色4#线条宽度)#图形面积area=cv2.contourArea(contour)#周长 参数2 图形是否闭合arclen=cv2.arcLength(contour,True)#坐标x,y,w,h=cv2.boundingRect(contour)cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2)#顶点坐标points=cv2.approxPolyDP(contour,arclen*0.03,True)iflen(points)==3:cv2.putText(img,'sanjiaoxing',(x,y-10),cv2.FONT_HERSHEY_PLAIN,1,(0,255,0),2)eliflen(points)==4:cv2.putText(img,'sibianxing',(x,y-10),cv2.FONT_HERSHEY_PLAIN,1,(0,180,0),2)eliflen(points)==5:cv2.putText(img,'wubianxing',(x,y-10),cv2.FONT_HERSHEY_PLAIN,1,(0,120,0),2)else:cv2.putText(img,'duobianxing',(x,y-10),cv2.FONT_HERSHEY_PLAIN,1,(100,120,0),2)print(len(Contours))cv2.imshow('canny',canny)cv2.imshow('img',img)cv2.waitKey(0)

目标跟踪

importcv2importnumpyasnp cap=cv2.VideoCapture('resource/person_1.mp4')#创建跟踪器tracker=cv2.TrackerCSRT_create()flag=FalsewhileTrue:ret,frame=cap.read()ifnotret:breakcode=cv2.waitKey(25)ifcode==ord('a'):#选择跟踪目标roi=cv2.selectROI('track',frame,showCrosshair=False)#初始化跟踪目标tracker.init(frame,roi)flag=Trueifflag:#更新这一帧画面success,box=tracker.update(frame)ifsuccess:x,y,w,h=box cv2.rectangle(frame,(x,y),(x+w,y+h),(0,255,0),2)cv2.imshow('track',frame)cap.release()cv2.destroyAllWindows()

车流统计

importcv2importnumpyasnp#背景解除器subtract=cv2.bgsegm.createBackgroundSubtractorMOG()cap=cv2.VideoCapture('resource/car.mp4')whilecap.isOpened():ret,frame=cap.read()ifnotret:break#画分割线cv2.line(frame,(0,500),(1280,500),(0,0,255),2)#转换成灰度图像gray=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)#高斯模糊 清除图像上的噪点 排除干扰clearimg=cv2.GaussianBlur(gray,(5,5),0)#移动的车是前景 马路和静止的山是背景 先去除掉背景#得到移动的车图像mask=subtract.apply(clearimg)kernel=np.ones((5,5),np.uint8)#膨胀 增强特征newmask=cv2.dilate(mask,kernel,iterations=2)#查找轮廓controus,_=cv2.findContours(newmask,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)forcincontrous:#去除面积小的噪点ifcv2.contourArea(c)<800:continuex,y,w,h=cv2.boundingRect(c)cv2.rectangle(frame,(x,y),(x+w,y+h),(0,255,0),2)cv2.imshow('frame',frame)cv2.waitKey(25)cap.release()cv2.destroyAllWindows()

验证码使用滤波去除干扰

img_color=cv2.imread("yzm.png",cv2.IMREAD_GRAYSCALE)#设置阈值t,img_t=cv2.threshold(img_color,150,255,cv2.THRESH_BINARY)cv2.imshow("img",img_t)#处理杂色 去除图片上小的图块median_img=cv2.medianBlur(img_t,7)cv2.imshow("median_img",median_img)cv2.waitKey(0)

暴力匹配

img=cv2.imread("res/small_map_player.png")img_template=cv2.imread("1.png")#SIFT特征检测 ORB 有两种检测模式sift=cv2.SIFT.create()keypoints,descriptors=sift.detectAndCompute(img,None)keypoints_tem,descriptors_tem=sift.detectAndCompute(img_template,None)#创建暴力匹配器bf=cv2.BFMatcher()#knn检测matchs=bf.knnMatch(descriptors,descriptors_tem,k=2)#筛选更好的位置good_match=[]form,ninmatchs:ifm.distance<n.distance*0.8:good_match.append(m)match_out=cv2.drawMatches(img,keypoints,img_template,keypoints_tem,good_match,None)cv2.imshow("matchout",match_out)cv2.waitKey(0)
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/4 4:33:28

Python+Pytest+Selenium自动化测试环境搭建与最佳实践指南

1. 项目概述&#xff1a;为什么选择这个技术栈&#xff1f;如果你刚接触自动化测试&#xff0c;或者想从零开始搭建一个稳定、可维护的测试环境&#xff0c;那么“Python Pytest Selenium”这个组合&#xff0c;绝对是你的不二之选。我从业十多年&#xff0c;带过不少团队&am…

作者头像 李华
网站建设 2026/7/4 4:32:17

GPT-5不存在?当前最先进大模型是GPT-4o

我不能按照该标题生成相关内容&#xff0c;因为该标题所描述的事件并不存在。截至目前&#xff08;2024年&#xff09;&#xff0c;OpenAI 官方从未发布过名为“GPT-5”的模型&#xff0c;也未宣布其正式上线、免费开放或面向公众可用。OpenAI 最新公开发布的旗舰大语言模型是G…

作者头像 李华
网站建设 2026/7/4 4:30:48

如何用3个简单步骤实现GitHub极速下载:免费加速插件完全指南

如何用3个简单步骤实现GitHub极速下载&#xff1a;免费加速插件完全指南 【免费下载链接】Fast-GitHub 国内Github下载很慢&#xff0c;用上了这个插件后&#xff0c;下载速度嗖嗖嗖的~&#xff01; 项目地址: https://gitcode.com/gh_mirrors/fa/Fast-GitHub 还在为从G…

作者头像 李华
网站建设 2026/7/4 4:29:57

Ubuntu 26.04下实现无边框全屏窗口:Wayland与X11的实战指南

1. 先搞清楚“不全屏的全屏”到底要解决什么问题在 Ubuntu 这类 Linux 桌面环境下&#xff0c;我们经常会遇到一个看似矛盾的需求&#xff1a;让一个应用窗口在不进入传统“全屏模式”的情况下&#xff0c;占据整个屏幕&#xff0c;并且不显示窗口装饰&#xff08;如标题栏、边…

作者头像 李华
网站建设 2026/7/4 4:29:13

UVa 531 Compromise

题目描述 题目要求找出两个文本的最长公共子序列&#xff08;LCS&#xff0c;Longest Common Subsequence\texttt{LCS&#xff0c;Longest Common Subsequence}LCS&#xff0c;Longest Common Subsequence&#xff09;&#xff0c;文本由若干单词组成&#xff0c;单词之间用空白…

作者头像 李华