https://blog.csdn.net/wc781708249/article/details/78518447
1抠图
import cv2 import numpy as np if __name__ == '__main__' : # Read image im = cv2.imread("image.jpg") # Select ROI r = cv2.selectROI(im) # Crop image imCrop = im[int(r[1]):int(r[1]+r[3]), int(r[0]):int(r[0]+r[2])] # Display cropped image cv2.imshow("Image", imCrop) cv2.waitKey(0)
从左上角拖动矩形到右下角
如果你像我一样,你会喜欢把一个矩形从左上角拖到右下角,而不是从中心拖动。 那么,我们可以很容易地解决这个问题,用下面一行代替突出显示的行。
fromCenter = False
r = cv2.selectROI(im, fromCenter)
不想显示十字线?
现在,假设你不喜欢十字准线,并希望看到没有它的矩形。 您可以修改代码以不显示十字线。
showCrosshair = False fromCenter = False r = cv2.selectROI("Image", im, fromCenter, showCrosshair)
2 保存
import cv2 cv2.namedWindow("Image") #创建窗口 img = cv2.imread('ver.jpg') cv2.imshow("Image",img) cv2.imwrite('test.jpg',img,[int(cv2.IMWRITE_JPEG_QUALITY),70]) cv2.waitKey(0) cv2.destroyWindow("Image") #关闭窗口
3 匹配
单对象匹配
- 模板匹配也是应用卷积来实现的:假设原图大小为W×H,模板图大小为w×h,那么生成图大小是(W-w+1)×(H-h+1),生成图中的每个像素值表示原图与模板的匹配程度。
- 模板匹配的原理其实很简单,就是不断地在原图中移动模板图像去比较,有6种不同的比较方法:
- 平方差匹配 CV_TM_SQDIFF:用两者的平方差来匹配,最好的匹配值为0
- 归一化平方差匹配 CV_TM_SQDIFF_NORMED
- 相关匹配 CV_TM_CCORR:用两者的乘积匹配,数值越大表明匹配程度越好
- 归一化相关匹配CV_TM_CCORR_NORMED
- 相关系数匹配 CV_TM_CCOEFF:用两者的相关系数匹配,1表示完美的匹配,-1表示最差的匹配
- 归一化相关系数匹配 CV_TM_CCOEFF_NORMED
https://zhuanlan.zhihu.com/p/62643151
import cv2 import numpy as np from matplotlib import pyplot as plt # 1.模板匹配 img = cv2.imread('dog.jpg') img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) template = cv2.imread('face_dog.jpg', 0) h, w = template.shape[:2] # rows->h, cols->w # 6种匹配方法 methods = ['cv2.TM_CCOEFF', 'cv2.TM_CCOEFF_NORMED', 'cv2.TM_CCORR', 'cv2.TM_CCORR_NORMED', 'cv2.TM_SQDIFF', 'cv2.TM_SQDIFF_NORMED'] for meth in methods: img2 = img.copy() # 匹配方法的真值 method = eval(meth) res = cv2.matchTemplate(img_gray, template, method) min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res) # 如果是平方差匹配TM_SQDIFF或归一化平方差匹配TM_SQDIFF_NORMED,取最小值 if method in [cv2.TM_SQDIFF, cv2.TM_SQDIFF_NORMED]: top_left = min_loc else: top_left = max_loc bottom_right = (top_left[0] + w, top_left[1] + h) cv2.circle(res, top_left, 10, 0, 2) # 画矩形| cv2.rectangle(img2, top_left, bottom_right, (0, 255, 0), 2)
多对象匹配
✔️ 单个匹配是找最大匹配的点,所以只能匹配一次。
✔️ 对于多对象匹配,我们需要设定一个匹配阈值来匹配多次。
img_rgb = cv2.imread('mario.jpg') img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY) template = cv2.imread('mario_coin.jpg', 0) h, w = template.shape[:2] res = cv2.matchTemplate(img_gray, template, cv2.TM_CCOEFF_NORMED) threshold = 0.8 # 取匹配程度大于%80的坐标 loc = np.where(res >= threshold) for pt in zip(*loc[::-1]): # *号表示可选参数 bottom_right = (pt[0] + w, pt[1] + h) cv2.rectangle(img_rgb, pt, bottom_right, (0, 0, 255), 2) cv2.imshow('img_rgb', img_rgb) cv2.waitKey(0)