OpenCV Error: Assertion failed (scn == 3 || scn == 4)in cv::cvtColor, file C:\projects\opencv-python\opencv\modules\imgproc\src\color.cpp, line 11111

1 加载路径有错误
2 参数0是灰度,再灰度化出错

模板匹配
import cv2
import numpy as np#加载原始RGB图像
img_rgb = cv2.imread("C:/Users/AEC/Desktop/1.png")
#创建一个原始图像的灰度版本,所有操作在灰度版本中处理,然后在RGB图像中使用相同坐标还原
img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY)#加载将要搜索的图像模板
template = cv2.imread('C:/Users/AEC/Desktop/2.png',0)
#记录图像模板的尺寸
w, h = template.shape[::-1]"""
#查看三组图像(图像标签名称,文件名称)
cv2.namedWindow("rgb")
cv2.imshow('rgb',img_rgb)
cv2.namedWindow("gray")
cv2.imshow('gray',img_gray)
cv2.namedWindow("template")
cv2.imshow('template',template)
cv2.waitKey(0)
cv2.destroyAllWindows()
"""
#使用matchTemplate对原始灰度图像和图像模板进行匹配
res = cv2.matchTemplate(img_gray,template,cv2.TM_CCOEFF_NORMED)
#设定阈值
threshold = 0.7
#res大于70%
loc = np.where( res >= threshold)#使用灰度图像中的坐标对原始RGB图像进行标记
for pt in zip(*loc[::-1]):cv2.rectangle(img_rgb, pt, (pt[0] + w, pt[1] + h), (0,0,255), 2)
#显示图像
cv2.namedWindow("Detected",0)
cv2.imshow('Detected',img_rgb)
cv2.imwrite("1_after.png",img_rgb)
cv2.waitKey(0)
cv2.destroyAllWindows()

模板

原图
原图


效果图

问题1 如果图像旋转了就匹配不到,试着解决这个问题 解决方案:
旋转模板匹配图案
问题2 可以看到对同一个图有多个框标定,需要去重,只需要保留一个
解决方案:对框边界值设置阈值,阈值范围内就当成一个框
问题3 可能有漏检过检情况
通过调节阈值解决

经过差不多大半天的努力解决了以上一些问题
下面这个程序实现对两个图案的匹配

import cv2
import numpy as np# 加载原始RGB图像
img_rgb = cv2.imread("origin.png")
# 创建一个原始图像的灰度版本,所有操作在灰度版本中处理,然后在RGB图像中使用相同坐标还原
img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY)
# 加载将要搜索的图像模板
#模板1 筛选图案1
template1 = cv2.imread('template1.png', 0)
#模板2 3 筛选图案2
template2 = cv2.imread('template2.png', 0)
template3 = cv2.imread('template3.png', 0)
# 记录图像模板的尺寸
w1, h1 = template1.shape[::-1]
w2, h2 = template2.shape[::-1]
w3, h3 = template3.shape[::-1]def rotate_bound(image, angle):#图片旋转但不改变大小,模板匹配中大小改变对匹配效果有影响(h, w) = image.shape[:2](cX, cY) = (w // 2, h // 2)#//是向下取整M = cv2.getRotationMatrix2D((cX, cY), -angle, 1.0)cos = np.abs(M[0, 0])sin = np.abs(M[0, 1])nW = int((h * sin) + (w * cos))nH = int((h * cos) + (w * sin))M[0, 2] += (nW / 2) - cXM[1, 2] += (nH / 2) - cYreturn cv2.warpAffine(image, M, (nW, nH))#选出所有匹配旋转模板且不重复的图案
def make_contour(template,w,h,angle,threshold):rects = []# 模板旋转匹配for i in range(0, 360, angle):new_rotate = rotate_bound(template, i)# 把图片旋转后黑色的部分填充成白色new_rotate[new_rotate == 0] = 255# 使用matchTemplate对原始灰度图像和图像模板进行匹配res = cv2.matchTemplate(img_gray, new_rotate, cv2.TM_CCOEFF_NORMED)# 设定阈值loc = np.where(res >= threshold)#x,y坐标对调打包for pt in zip(*loc[::-1]):point = np.array([[pt[0], pt[1]], [pt[0] + w, pt[1]],[pt[0], pt[1] + h], [pt[0] + w, pt[1] + h]])rects.append(cv2.boundingRect(point))#模板匹配后符合要求的所有图案数量length = len(rects)#设定阈值threshold = 3i = 0#如果两个图案距离在阈值范围内,则等同,然后用集合去重while(i<length):print(i)for j in range(length):if j != i:if np.abs(rects[j][0]-rects[i][0])<= threshold:if np.abs(rects[j][1]-rects[i][1]) <= threshold:rects[j] = rects[i]i = i+1return set(rects)#在原图把匹配的模板框出来并输出坐标文档
def draw_contour(contours,color):count = 0for contour in contours:cv2.rectangle(img_rgb, (contour[0], contour[1]), (contour[0] + contour[2], contour[1] + contour[3]),color, 1)cx = contour[0] + (contour[2] // 2)cy = contour[1] + (contour[3] // 2)count = count + 1cv2.putText(img_rgb, str(count), (cx, cy), cv2.FONT_HERSHEY_SIMPLEX, 1,color, 1, 1)with open("data.txt", "a+") as f:f.write("contour" + '\t' + str(count) + '\t' + 'cx: ' + str(cx) + '  \t' + 'cy: ' + str(cy) + '\n')# 显示图像cv2.imwrite("after.png", img_rgb)if __name__=='__main__':#a+可读可写覆盖with open("data.txt", "a+") as f:f.write('contour1'+'\n')threshold1 = 0.69contours1 = make_contour(template1,w1,h1,90,threshold1)color1 = (255, 0, 0)draw_contour(contours1,color1)img_rgb = cv2.imread("after.png")img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY)with open("data.txt", "a+") as f:f.write('\n'+'contour2'+'\n')color2 = (0,0,255)threshold2 = 0.53#合并轮廓contours2 = list(make_contour(template2, w2, h2,30,threshold2))+list(make_contour(template3, w3, h3, 30, threshold2))draw_contour(contours2,color2)

匹配效果很好,阈值调节需要谨慎,0.01的差距可能会造成一个漏检

输出每个框的位置坐标

模板匹配 解决模板旋转以及重复检测问题相关推荐

  1. opencv模板匹配做电表读数区域的检测

    描述 电表读数识别的时候,需要进行读数区域的检测.在PC上用什么方法都可以因为没有硬件限制.在移动端/终端的时候,因为硬件的限制无法用深度学习,可以尝试图像处理的模板匹配. 模板图片 测试图片 cod ...

  2. opencv 有无判断 模板匹配_opencv模板匹配

    模板匹配在图像处理中经常使用,该算法主要用于寻找图像中与模板图像相同的区域.此外,也用于图像定位,通过模板匹配找到指定的位置,然后进行后续的处理. 在进行模板匹配的时候,需要先制作模板,模板图像一般是 ...

  3. python中括号配对检测_使用模板匹配在Python上进行对象检测!(附代码)

    了解如何在没有机器学习或任何框架的情况下在Python上进行对象检测 每当我们听说" 对象检测 "时,我们就会想到机器学习以及不同的框架.但是我们实际上可以在不使用机器学习或任何其 ...

  4. 【视觉项目】【day2】8.21号实验记录(手机固定高度15cm拍摄+直方图均衡化+模板匹配,模板12个,测试28个,效果十分差)

    目录 均衡化代码 模板图片按照大小排序 总代码 测试效果 新思路 由于模板匹配是像素之间的比对,所以不同光照下的像素灰度值也会不同 所以在比对之前,我们需要对测试图和模板图进行直方图均衡化,这一步可以 ...

  5. [模板匹配霍夫变换]——模板匹配分析、霍夫变换分析

    一.模板匹配分析 所谓模板匹配,就是在给定的图片中查找和模板最相似的区域,该算法的输入包括模板和图片,整个任务的思路就是按照滑窗的思路不断的移动模板图片,计算其与图像中对应区域的匹配度,最终将匹配度最 ...

  6. 用c语言对图像进行模板匹配,[转载]模板匹配的基本概念

    简单而言,模板就是一幅已知的小图像.模板匹配就是在一幅大图像中搜寻目标,已知 该图中有要找的目标,且该目标同模板有相同的尺寸.方向和图像,通过一定的算法可以 在图中找到目标,确定其坐标位置. 以8 位 ...

  7. Opencv(六)模板匹配、轮廓检测、轮廓周围绘制矩形框和圆形框

    模板匹配介绍 模板匹配就是在整个图像区域发现与给定子图像匹配的小块区域. 所以模板匹配首先需要一个模板图像T(给定的子图像) 另外需要一个待检测的图像-源图像S 工作方法,在带检测图像上,从左到右,从 ...

  8. 通过模板匹配先定位检测的对象再检测圆形零件和孔针02

    图中红色区域的孔和针的检测 如果相机像素很大,直接找很慢,可以通过深度学习的方式或模板匹配定位,然后再做检测 1 images/HoleTemplate.jpg  NeedleTemplate.jpg ...

  9. OpenCV中使用模板匹配识别空闲的货架空间

    但是点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 假设你是一名在超市工作的员工,被要求在商店里四处走动,检查需要 ...

最新文章

  1. typedef 返回类型(*Function)(参数表) ——typedef函数指针
  2. WindowsPhone后台新特性
  3. 2020最后一个月,近4成应届生未就业,19个头部城市谁最留不住人?
  4. JZOJ 5638. 【NOI2018模拟4.8】IIIDX
  5. CSS:你真的会用 z-index 吗?
  6. 学习响应式BootStrap来写融职教育网站,Bootsrtap第十三天讲师列表栏目
  7. java 修改 枚举类字段_枚举枚举和修改“最终静态”字段的方法
  8. 【转】英文论文中“such as, for example, e.g., i.e., etc., et al. ”的用法分析
  9. 新闻 | 聚焦技术领域现状与发展阿里巴巴知识图谱专场亮相云栖大会 阿里知识图谱亮相云栖大会产学深度交流推进业务创新
  10. 用户自定义排序的几种实现思路
  11. python调用TensorFlow时报错:FutureWarning: Passing (type, 1) or ‘1type‘ as a synonym of type is deprecated
  12. Visual Basic里与Print有关的函数
  13. awk命令的使用案列
  14. html5光标进去默认值消失,html点击input没有出现光标怎么办
  15. OSPF特殊区域和选路规则
  16. weixin-java-tools工具-出现JedisDataException问题
  17. 基于EEG信号的情绪分析数据库DEAP论文调研
  18. 在matlab下使用深度学习预训练模型Alex Net进行迁移学习的实验与分析
  19. Java后端开发之JSON入门
  20. 快速云:IDC、EDC、ODC、DC分别指什么机房?

热门文章

  1. 利用AnyLogic软件搭建多智能体模型验证Lanchester方程线性律和平方律
  2. 教你制作启动U盘,用U盘装系统(转载)
  3. git命令行切换到某一个提交版本的分支
  4. web前端编程实战实例:制作静态京东首页
  5. 快速构建一款 AR App 入门指南
  6. 零基础学SQL(十一、视图)
  7. 我国第三方支付的发展及监管现状
  8. 第一章:Linux下shell常用命令
  9. 双非硕士阿里大数据开发面经(已拿offer)(建议收藏)
  10. 205. Isomorphic Strings