当前位置: 首页 > news >正文

计算机视觉opencv之绘制轮廓模版匹配,传参方法

一、绘制轮廓

上一篇博客中我们介绍了轮廓的绘制,但是比较片面

现在我们实现对图片花的外轮廓用红线绘制

如果我们使用上一次轮廓绘制的代码会发现,效果并不是预想的那样

import cv2 image1=cv2.imread(r"D:\project\hua.png") image1_gray=cv2.cvtColor(image1,cv2.COLOR_BGR2GRAY) cv2.imshow('image1_gray',image1_gray) cv2.waitKey(0) ret,image1_binary=cv2.threshold(image1_gray,120,255,cv2.THRESH_BINARY) cv2.imshow('image1_binary',image1_binary) cv2.waitKey(0) _,contours,hierarchy=cv2.findContours(image1_binary,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE) print(len(contours)) image_copy=image1.copy() cv2.drawContours(image=image_copy,contours=contours,contourIdx=-1,color=(0,255,255),thickness=2) cv2.imshow('image_copy',image_copy) cv2.waitKey(0)

我们需要调节一下参数

ret,image1_binary=cv2.threshold(image1_gray,120,255,cv2.THRESH_BINARY)

这句话中我们拿我们处理的灰度图进行二值化,120就是一个临界值。在这里0~255,0表示黑色,255表示白色,120以下的值就会被处理为0,即黑色,120以上就被处理为255,即白色,就像下图第二张图显示一样,所以如果我们想要达到理想的效果就要把背景和花束二值化区别彻底

现在我们把120改为240(这里的值是需要自己慢慢去调试的),会发现花束和北京已经能很好的区别开了,但是我们队轮廓获取的时候,发现轮廓描绘把这张图片的轮廓也绘制了,这是因为opencv的一个特点,轮廓描绘会对像素为255,也就是白色部分进行绘制。

上一篇讲述轮廓绘制的时候我们使用的是

二值化处理的时候背景图由于本身就是深色,所以处理成了黑色,绘制轮廓就没有出现把图片本身轮廓绘制出来的情况

这里知道,opencv绘制图片轮廓的时候,我们需要对想要获取轮廓的物体处理成白色,背景处理为黑色。

所以这里我们想要获得理想效果就可以:

import cv2 import numpy as np image1 = cv2.imread(r"D:\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, key=cv2.contourArea) # 1. 绿色近似轮廓 epsilon = 0.005 * cv2.arcLength(flower_contour, True) approx = cv2.approxPolyDP(flower_contour, epsilon, True) cv2.drawContours(image=image_combined, contours=[approx], contourIdx=-1, color=(0, 255, 0), thickness=2) # 2. 红色原始轮廓 cv2.drawContours(image=image_combined, contours=[flower_contour], contourIdx=-1, color=(0, 0, 255), thickness=2) 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, result=None, mask=None) # image:待搜索图像 # templ:模板图像 # method:计算匹配程度的方法,可以有: # TM_SQDIFF平方差匹配法:该方法采用平方差来进行匹配;匹配越好,值越小;匹配越差,值越大。 # TM_CCORR相关匹配法:该方法采用乘法操作;数值越大表明匹配程度越好。 # TM_CCOEFF相关系数匹配法:数值越大表明匹配程度越好。 # TM_SQDIFF_NORMED归一化平方差匹配法,匹配越好,值越小;匹配越差,值越大。 # TM_CCORR_NORMED归一化相关匹配法,数值越大表明匹配程度越好。 # TM_CCOEFF_NORMED 归一化相关系数匹配法,数值越大表明匹配程度越好。

import cv2 image2=cv2.imread(r"D:\project\kele.png") template=cv2.imread(r"D:\project\template.png") cv2.imshow('kele',image2) cv2.imshow('area',template) cv2.waitKey(0) h,w=template.shape[:2] res=cv2.matchTemplate(image2,template,cv2.TM_CCOEFF_NORMED) min_val,max_val,min_loc,max_loc=cv2.minMaxLoc(res) top_left=max_loc bottom_right=(top_left[0]+w,top_left[1]+h) kele_template=cv2.rectangle(image2,top_left,bottom_right,(0,255,255),2) cv2.imshow('kele_tem',kele_template) cv2.waitKey(0)

三、传参方法

argparse是python标准库,用于解析命令行参数

让我们写的python脚本能从命令行接受参数

框架:

参数名可以有多个,用逗号隔开

type是参数的数值类型,有int,str,float……

default是参数的默认数值,我们可以通过掺入参数去改变

help可以帮助使用该脚本的人如何使用脚本

import argparse parser=argparse.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='备注') opt=parser.parse_args() a=opt.参数名 b=opt.参数名 print(a+b)

例如,运行就会执行S和C的值相加的结果,是110

关于参数的传入,有两种方式

1.第一种

可以点击右键,点击修改运行配置,参数名和数值用空格隔开,多个值修改也用空格隔开,这里我们把S值传入50,把C的值传入30,点击确定

再次运行,结果就是80,这是因为我们传入的参数

2.第二种

找到我们pycharm工具下的终端

点击终端,会有下面这个界面,其实这里的作用就和win+r,cmd一样的功能,是通过命令行操作的

因为我的这个文件在learn下的计算机视觉目录中,所以需要cd到该目录下

python加文件能运行该脚本文件

python 文件名 参数和对应数值,就能实现传入参数。

一个结果是110,使用的是默认值,一个是85是我们传入的值

python 文件名 -h就是帮助使用脚本的

http://www.jsqmd.com/news/493012/

相关文章:

  • Qwen3-ASR-0.6B多场景落地:支持API服务化、桌面客户端、Web嵌入三类部署形态
  • 鸿蒙 PC 实战:交叉编译 zlib(aarch64-linux-ohos)完整可复现指南
  • Nunchaku FLUX.1 CustomV3镜像免配置:内置CUDA 12.1+PyTorch 2.3+ComfyUI v0.3.18
  • Qwen3-ASR-1.7B语音识别入门:如何用少量样本做LoRA微调提升垂直领域识别率
  • SmallThinker-3B-Preview效果实测:在单线程CPU上完成3K token COT推理耗时<42s
  • Phi-3-mini-128k-instruct镜像免配置指南:开箱即用的38亿参数开源模型快速上手
  • RexUniNLU开源大模型:符合《生成式AI服务管理暂行办法》合规性说明
  • CasRel关系抽取模型快速上手:无需训练直接调用预训练中文Base模型
  • 漫画脸描述生成多风格实测:日系萌系vs赛博朋克角色生成效果对比
  • Qwen2.5-VL-7B-Instruct保姆级教学:conda环境隔离+模型权重路径校验+端口释放
  • 文脉定序保姆级教程:对接Elasticsearch插件实现透明重排序增强
  • Audio Pixel Studio生产环境部署:Nginx反向代理+HTTPS安全访问配置详解
  • FireRed-OCR Studio企业落地:财务报表/合同/论文批量数字化方案
  • 马卡龙UI×专业拆解:软萌拆拆屋在时尚教育中的创新教学实践
  • ADC模数转换器
  • Qwen3-0.6B-FP8核心功能:双模式推理与实时参数调节深度解析
  • DeepSeek-R1-Distill-Qwen-1.5B参数详解:temperature=0.6与top_p=0.95如何优化推理严谨性
  • Qwen3-ForcedAligner-0.6B实战教程:批量音频文件自动化转录脚本开发
  • StructBERT RESTful API集成指南:对接业务系统实现自动化语义校验
  • Qwen2.5-7B-Instruct环保监测:环评报告生成+排污分析+绿色转型建议
  • Pi0视觉-语言-动作模型企业应用:低成本具身智能开发平台构建方案
  • DAMO-YOLO手机检测效果展示:demo/示例图高亮框+置信度可视化
  • 深度学习项目训练环境企业落地:某AI初创公司用该镜像将算法交付周期从2周压缩至3天
  • stm32HAL库onenet平台数据实时获取实例--PH值获取与上传
  • Qwen3-0.6B-FP8游戏开发辅助:NPC对话生成+任务脚本设计+世界观构建
  • AI头像生成器惊艳效果:生成‘三星堆青铜面具×霓虹光影’文化科技风头像文案
  • gte-base-zh部署优化:使用--model-format pytorch提升加载速度35%
  • 千问3.5-27B企业落地:物流公司运单图识别→提取收发件信息+预测派送时效+异常标记
  • StructBERT情感模型效果展示:多场景文本(评论/对话/描述)分类对比
  • 【XR开发系列】UI 入门 - 创建一个简单的分数显示