python批量实现模板匹配处理,并将图片进行标记和裁剪保存
生活随笔
收集整理的這篇文章主要介紹了
python批量实现模板匹配处理,并将图片进行标记和裁剪保存
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
簡介
主要是通過python的opencv進行模板匹配識別到想要得到的物體;
然后通過opencv進行裁切圖片,得到最終需要的圖片
核心內容
①模板匹配,帶有nms的模板匹配
②批量處理圖片,并保存
代碼
import os import cv2 import time import numpy as npdef py_nms(dets, thresh):"""Pure Python NMS baseline."""# x1、y1、x2、y2、以及score賦值# (x1、y1)(x2、y2)為box的左上和右下角標x1 = dets[:, 0]y1 = dets[:, 1]#左上角的坐標值x2 = dets[:, 2]y2 = dets[:, 3]#右下角的閾值scores = dets[:, 4]# 每一個候選框的面積areas = (x2 - x1 + 1) * (y2 - y1 + 1)# order是按照score降序排序的,從大到小order = scores.argsort()[::-1]# print("order:",order)keep = []while order.size > 0:i = order[0]keep.append(i)# 計算當前概率最大矩形框與其他矩形框的相交框的坐標,會用到numpy的broadcast機制,得到的是向量xx1 = np.maximum(x1[i], x1[order[1:]])yy1 = np.maximum(y1[i], y1[order[1:]])xx2 = np.minimum(x2[i], x2[order[1:]])yy2 = np.minimum(y2[i], y2[order[1:]])# 計算相交框的面積,注意矩形框不相交時w或h算出來會是負數,用0代替w = np.maximum(0.0, xx2 - xx1 + 1)h = np.maximum(0.0, yy2 - yy1 + 1)inter = w * h# 計算重疊度IOU:重疊面積/(面積1+面積2-重疊面積)ovr = inter / (areas[i] + areas[order[1:]] - inter)# 找到重疊度不高于閾值的矩形框索引inds = np.where(ovr <= thresh)[0]# print("inds:",inds)# 將order序列更新,由于前面得到的矩形框索引要比矩形框在原order序列中的索引小1,所以要把這個1加回來order = order[inds + 1]return keepdef template(img_gray, template_img, template_threshold):'''img_gray:待檢測的灰度圖片格式template_img:模板小圖,也是灰度化了template_threshold:模板匹配的置信度'''h, w = template_img.shape[:2]#獲取模板的高和寬res = cv2.matchTemplate(img_gray, template_img, cv2.TM_CCOEFF_NORMED)#模板匹配的方式start_time = time.time()loc = np.where(res >= template_threshold) # 大于模板閾值的目標坐標,返回的就是矩陣的行列索引值,其中行坐標為坐標的y值,列坐標為x值score = res[res >= template_threshold]# 大于模板閾值的目標置信度cv2.matchTemplate(img_gray, template_img, cv2.TM_CCOEFF_NORMED)[res >= template_threshold]完整寫法# 將模板數據坐標進行處理成左上角、右下角的格式xmin = np.array(loc[1])#列坐標為x值ymin = np.array(loc[0])#橫坐標為y值xmax = xmin + wymax = ymin + hxmin = xmin.reshape(-1, 1) # 變成n行1列維度xmax = xmax.reshape(-1, 1) # 變成n行1列維度ymax = ymax.reshape(-1, 1) # 變成n行1列維度ymin = ymin.reshape(-1, 1) # 變成n行1列維度score = score.reshape(-1, 1) # 變成n行1列維度data_hlist = []data_hlist.append(xmin)data_hlist.append(ymin)data_hlist.append(xmax)data_hlist.append(ymax)data_hlist.append(score)data_hstack = np.hstack(data_hlist) # 將xmin、ymin、xmax、yamx、scores按照列進行拼接 np.hstack():在水平方向上平鋪 np.vstack():在豎直方向上堆疊thresh = 0.3 # NMS里面的IOU交互比閾值keep_dets = py_nms(data_hstack, thresh)print("nms time:", time.time() - start_time)dets = data_hstack[keep_dets] return detsdef saveresult(name,file,img_rgb):isExists = os.path.exists("./"+ str(name)+'/')if not isExists: # 判斷如果文件不存在,則創建os.makedirs("./"+ str(name)+'/')print("./"+ str(name)+'/'+"目錄創建成功")out =str(file.split('.')[0])filename="./"+ name+'/%s.jpg'%(out)print('已匹配圖片:'+filename)cv2.imwrite(filename, img_rgb)def savecut(name,file,cut):isExists = os.path.exists("./"+ str(name)+'/')if not isExists: # 判斷如果文件不存在,則創建os.makedirs("./"+ str(name)+'/')print("./"+ str(name)+'/'+"目錄創建成功")out =str(file.split('.')[0])filename="./"+ name+'/%s.jpg'%(out)print('已裁切圖片:'+filename)cv2.imwrite(filename, cut)if __name__ == "__main__":jpg_path = "./images/" # 圖片存放文件夾的路徑file_walk = os.listdir(jpg_path)for file in file_walk:file1 = os.path.join(jpg_path, file)img_rgb = cv2.imread(file1)img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY)template_img = cv2.imread('1.jpg', 0) # 模板template_threshold = 0.45 # 模板置信度dets = template(img_gray, template_img, template_threshold)for coord in dets:cv2.rectangle(img_rgb, (int(coord[0]), int(coord[1])), (int(coord[2]), int(coord[3])), (0, 0, 255), 2)cut = img_rgb[int(coord[1]):int(coord[3]),int(coord[0]):int(coord[2])]#裁切坐標為(y0:y1,x0:x1)save1 = saveresult('save',file,img_rgb)save2 = savecut('savepicture',file,cut)print("*******************************************************************************")print('* 已完成模板匹配任務 *')print("*******************************************************************************")參考、致謝
非常感謝下列博主寫出的優秀好文
http://t.csdn.cn/UQBZr
http://t.csdn.cn/o7Ln8
http://t.csdn.cn/oVJgm
http://t.csdn.cn/9cJb4
希望本人寫的代碼能給大家帶來一絲便利,謝謝大家支持
總結
以上是生活随笔為你收集整理的python批量实现模板匹配处理,并将图片进行标记和裁剪保存的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 细胞污染及污染源排查与细胞传代、冻存
- 下一篇: 大运新城14号线坳背站坳二村片区城市更新