import cv2 # 读取目标图和样本图 target_img = cv2.imread("target.jpg") sample_img = cv2.imread("sample.jpg") # 获取样本图的宽度和高度 sample_height, sample_width = sample_img.shape[:2] # 使用 TM_CCOEFF_NORMED 方法进行模板匹配 res = cv2.matchTemplate(target_img, sample_img, cv2.TM_CCOEFF_NORMED) # 获取匹配结果中的最大值和最大值的位置 min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res) # 如果最大值大于0.8,则说明目标图中存在样本图 if max_val > 0.8: # 计算样本图在目标图中的左上角和右下角坐标 top_left = max_loc bottom_right = (top_left[0] + sample_width, top_left[1] + sample_height) # 在目标图中绘制出样本图的位置 cv2.rectangle(target_img, top_left, bottom_right, (0, 0, 255), 2) # 显示结果图像 cv2.imshow("Result", target_img) cv2.waitKey(0) cv2.destroyAllWindows() else: print("目标图中不存在样本图")
时间: 2024-03-19 09:42:34 浏览: 61
以上代码使用OpenCV库进行模板匹配,其中`target.jpg`为目标图像,`sample.jpg`为样本图像。
首先使用`cv2.imread()`函数读取目标图像和样本图像,并获取样本图像的宽度和高度。然后使用`cv2.matchTemplate()`函数进行模板匹配,并使用`cv2.minMaxLoc()`函数获取匹配结果中的最大值和最大值的位置。
如果最大值大于0.8,则说明目标图像中存在样本图像。可以计算出样本图像在目标图像中的左上角和右下角坐标,并使用`cv2.rectangle()`函数在目标图像中绘制出样本图像的位置。最后使用`cv2.imshow()`函数显示结果图像,并使用`cv2.waitKey()`函数等待用户按下任意键,最后使用`cv2.destroyAllWindows()`函数关闭所有窗口。
如果最大值小于等于0.8,则说明目标图像中不存在样本图像,可以输出提示信息。
相关问题
我有一张样本图,我需要识别目标图中是否含有这个样本图,如果含有样本图,我需要计算出样本图在目标图所在位置的坐标。python
这个问题可以通过使用OpenCV库和模板匹配算法来解决。以下是一个简单的示例代码:
```python
import cv2
# 读取目标图和样本图
target_img = cv2.imread("target.jpg")
sample_img = cv2.imread("sample.jpg")
# 获取样本图的宽度和高度
sample_height, sample_width = sample_img.shape[:2]
# 使用 TM_CCOEFF_NORMED 方法进行模板匹配
res = cv2.matchTemplate(target_img, sample_img, cv2.TM_CCOEFF_NORMED)
# 获取匹配结果中的最大值和最大值的位置
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)
# 如果最大值大于0.8,则说明目标图中存在样本图
if max_val > 0.8:
# 计算样本图在目标图中的左上角和右下角坐标
top_left = max_loc
bottom_right = (top_left[0] + sample_width, top_left[1] + sample_height)
# 在目标图中绘制出样本图的位置
cv2.rectangle(target_img, top_left, bottom_right, (0, 0, 255), 2)
# 显示结果图像
cv2.imshow("Result", target_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
else:
print("目标图中不存在样本图")
```
在上述代码中,我们首先使用 `cv2.imread()` 方法读取目标图和样本图。然后,我们使用 `cv2.matchTemplate()` 方法进行模板匹配,并将匹配结果存储在 `res` 变量中。接着,我们使用 `cv2.minMaxLoc()` 方法获取匹配结果中的最大值和最大值的位置。如果最大值大于阈值0.8,则说明目标图中存在样本图。我们可以计算样本图在目标图中的左上角和右下角坐标,并使用 `cv2.rectangle()` 方法在目标图中绘制出样本图的位置。最后,我们使用 `cv2.imshow()` 方法显示结果图像,并使用 `cv2.waitKey()` 和 `cv2.destroyAllWindows()` 方法等待用户按下任意键关闭窗口。
如何利用python的opencv同时导入两张样本图,并在目标图中识别出样本图并分别给出坐标
可以使用Python的OpenCV库提供的模板匹配(Template Matching)函数`cv2.matchTemplate()`来实现。
以下是一个示例代码,其中我们将使用两个样本图`sample1.jpg`和`sample2.jpg`,并在目标图`target.jpg`中找到它们的位置:
```python
import cv2
# 读取目标图和两个样本图
target_img = cv2.imread('target.jpg')
sample1_img = cv2.imread('sample1.jpg')
sample2_img = cv2.imread('sample2.jpg')
# 获取样本图的宽高
sample1_height, sample1_width, _ = sample1_img.shape
sample2_height, sample2_width, _ = sample2_img.shape
# 使用模板匹配函数找到样本图在目标图中的位置
res1 = cv2.matchTemplate(target_img, sample1_img, cv2.TM_CCOEFF_NORMED)
res2 = cv2.matchTemplate(target_img, sample2_img, cv2.TM_CCOEFF_NORMED)
# 设置匹配阈值
threshold = 0.8
# 在目标图中标出匹配的位置
loc1 = np.where(res1 >= threshold)
for pt in zip(*loc1[::-1]):
cv2.rectangle(target_img, pt, (pt[0] + sample1_width, pt[1] + sample1_height), (0, 0, 255), 2)
loc2 = np.where(res2 >= threshold)
for pt in zip(*loc2[::-1]):
cv2.rectangle(target_img, pt, (pt[0] + sample2_width, pt[1] + sample2_height), (0, 255, 0), 2)
# 显示结果图
cv2.imshow('Result', target_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
在上述代码中,我们首先读取了目标图和两个样本图,然后使用模板匹配函数`cv2.matchTemplate()`在目标图中找到样本图的位置。接着,我们设置了匹配阈值,并使用`np.where()`函数找到匹配的位置。最后,我们在匹配位置上绘制矩形框,并将结果显示出来。
需要注意的是,模板匹配函数`cv2.matchTemplate()`在处理图像时是按照灰度图像处理的,因此我们需要在读入图像时将其转为灰度图像,或者在使用模板匹配函数之前,先将彩色图像转为灰度图像。
阅读全文