计算机视觉opencv之绘制轮廓模版匹配,传参方法
一、绘制轮廓上一篇博客中我们介绍了轮廓的绘制但是比较片面现在我们实现对图片花的外轮廓用红线绘制如果我们使用上一次轮廓绘制的代码会发现效果并不是预想的那样import cv2 image1cv2.imread(rD:\project\hua.png) image1_graycv2.cvtColor(image1,cv2.COLOR_BGR2GRAY) cv2.imshow(image1_gray,image1_gray) cv2.waitKey(0) ret,image1_binarycv2.threshold(image1_gray,120,255,cv2.THRESH_BINARY) cv2.imshow(image1_binary,image1_binary) cv2.waitKey(0) _,contours,hierarchycv2.findContours(image1_binary,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE) print(len(contours)) image_copyimage1.copy() cv2.drawContours(imageimage_copy,contourscontours,contourIdx-1,color(0,255,255),thickness2) cv2.imshow(image_copy,image_copy) cv2.waitKey(0)我们需要调节一下参数ret,image1_binarycv2.threshold(image1_gray,120,255,cv2.THRESH_BINARY)这句话中我们拿我们处理的灰度图进行二值化120就是一个临界值。在这里0~2550表示黑色255表示白色120以下的值就会被处理为0即黑色120以上就被处理为255即白色就像下图第二张图显示一样所以如果我们想要达到理想的效果就要把背景和花束二值化区别彻底现在我们把120改为240这里的值是需要自己慢慢去调试的会发现花束和北京已经能很好的区别开了但是我们队轮廓获取的时候发现轮廓描绘把这张图片的轮廓也绘制了这是因为opencv的一个特点轮廓描绘会对像素为255也就是白色部分进行绘制。上一篇讲述轮廓绘制的时候我们使用的是二值化处理的时候背景图由于本身就是深色所以处理成了黑色绘制轮廓就没有出现把图片本身轮廓绘制出来的情况这里知道opencv绘制图片轮廓的时候我们需要对想要获取轮廓的物体处理成白色背景处理为黑色。所以这里我们想要获得理想效果就可以import cv2 import numpy as np image1 cv2.imread(rD:\project\hua.png) # 转为灰度 image1_gray cv2.cvtColor(image1, cv2.COLOR_BGR2GRAY) ret, image1_binary cv2.threshold(image1_gray, 240, 255, cv2.THRESH_BINARY_INV) # 获取轮廓 _, contours, hierarchy cv2.findContours(image1_binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_TC89_KCOS) print(找到轮廓数量:, len(contours)) # 绘制结果 image_combined image1.copy() if len(contours) 0: # 取最大的轮廓 flower_contour max(contours, keycv2.contourArea) # 1. 绿色近似轮廓 epsilon 0.005 * cv2.arcLength(flower_contour, True) approx cv2.approxPolyDP(flower_contour, epsilon, True) cv2.drawContours(imageimage_combined, contours[approx], contourIdx-1, color(0, 255, 0), thickness2) # 2. 红色原始轮廓 cv2.drawContours(imageimage_combined, contours[flower_contour], contourIdx-1, color(0, 0, 255), thickness2) cv2.imshow(Inverted Image, image1_gray) cv2.imshow(Binary Image, image1_binary) cv2.imshow(Final Result, image_combined) cv2.waitKey(0) cv2.destroyAllWindows()轮廓绘制不重在怎么样绘制因为绘制是固定的最重要的是我们如何处理图像让机器识别出来。二、模板匹配# cv2.matchTemplate(image, templ, method, resultNone, maskNone) # image:待搜索图像 # templ:模板图像 # method:计算匹配程度的方法,可以有: # TM_SQDIFF平方差匹配法:该方法采用平方差来进行匹配;匹配越好值越小;匹配越差值越大。 # TM_CCORR相关匹配法:该方法采用乘法操作;数值越大表明匹配程度越好。 # TM_CCOEFF相关系数匹配法:数值越大表明匹配程度越好。 # TM_SQDIFF_NORMED归一化平方差匹配法匹配越好值越小;匹配越差值越大。 # TM_CCORR_NORMED归一化相关匹配法数值越大表明匹配程度越好。 # TM_CCOEFF_NORMED 归一化相关系数匹配法数值越大表明匹配程度越好。import cv2 image2cv2.imread(rD:\project\kele.png) templatecv2.imread(rD:\project\template.png) cv2.imshow(kele,image2) cv2.imshow(area,template) cv2.waitKey(0) h,wtemplate.shape[:2] rescv2.matchTemplate(image2,template,cv2.TM_CCOEFF_NORMED) min_val,max_val,min_loc,max_loccv2.minMaxLoc(res) top_leftmax_loc bottom_right(top_left[0]w,top_left[1]h) kele_templatecv2.rectangle(image2,top_left,bottom_right,(0,255,255),2) cv2.imshow(kele_tem,kele_template) cv2.waitKey(0)三、传参方法argparse是python标准库用于解析命令行参数让我们写的python脚本能从命令行接受参数框架参数名可以有多个用逗号隔开type是参数的数值类型有intstrfloat……default是参数的默认数值我们可以通过掺入参数去改变help可以帮助使用该脚本的人如何使用脚本import argparse parserargparse.ArgumentParser() parser.add_argument(--参数名,type,default,help备注) parser.add_argument(--参数名,type,default,help备注) parser.add_argument(--参数名,type,default,help备注) parser.add_argument(--参数名,type,default,help备注) optparser.parse_args() aopt.参数名 bopt.参数名 print(ab)例如运行就会执行S和C的值相加的结果是110关于参数的传入有两种方式1.第一种可以点击右键点击修改运行配置参数名和数值用空格隔开多个值修改也用空格隔开这里我们把S值传入50把C的值传入30点击确定再次运行结果就是80这是因为我们传入的参数2.第二种找到我们pycharm工具下的终端点击终端会有下面这个界面其实这里的作用就和winrcmd一样的功能是通过命令行操作的因为我的这个文件在learn下的计算机视觉目录中所以需要cd到该目录下python加文件能运行该脚本文件python 文件名 参数和对应数值就能实现传入参数。一个结果是110使用的是默认值一个是85是我们传入的值python 文件名 -h就是帮助使用脚本的