掩码 图像分割
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)