【OpenCV】尺寸测量
文章目录
- 前言
- 一、代码分析
- 二、输出结果
- 三、参考资料
前言
需要一个已经知道尺寸的物体作为参考。
物体实际宽度/照片中物体的宽度=参考物实际宽度/照片中参考物的宽度
下图左上角方框为2cmX2cm的正方向。
一、代码分析
Filename: init.py
Usage: This script will measure different objects in the frame using a reference object of known dimension.
The object with known dimension must be the leftmost object.
Author: Shashank Sharma
"""
from scipy.spatial.distance import euclidean
from imutils import perspective
from imutils import contours
import numpy as np
import imutils
import cv2# Function to show array of images (intermediate results) 显示图片函数
def show_images(images):for i, img in enumerate(images):cv2.imshow("image_" + str(i), img)cv2.waitKey(0)cv2.destroyAllWindows()img_path = "images/example_02.jpg"#读取图片# Read image and preprocess
image = cv2.imread(img_path)gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)#转灰度图
blur = cv2.GaussianBlur(gray, (9, 9), 0)#高斯滤波edged = cv2.Canny(blur, 50, 100)#获取边缘
edged = cv2.dilate(edged, None, iterations=1)#膨胀
edged = cv2.erode(edged, None, iterations=1)#腐蚀#show_images([blur, edged])# Find contours 找轮廓
cnts = cv2.findContours(edged.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = imutils.grab_contours(cnts)# Sort contours from left to right as leftmost contour is reference object 轮廓排序
(cnts, _) = contours.sort_contours(cnts)# Remove contours which are not large enough 去掉轮廓面积小的
cnts = [x for x in cnts if cv2.contourArea(x) > 100]#cv2.drawContours(image, cnts, -1, (0,255,0), 3)#show_images([image, edged])
#print(len(cnts))# Reference object dimensions
# Here for reference I have used a 2cm x 2cm square
ref_object = cnts[0]
box = cv2.minAreaRect(ref_object)#最小外接矩形
box = cv2.boxPoints(box)
box = np.array(box, dtype="int")
box = perspective.order_points(box)
(tl, tr, br, bl) = box
dist_in_pixel = euclidean(tl, tr)
dist_in_cm = 2
pixel_per_cm = dist_in_pixel/dist_in_cm #计算单位长度中的像素个数# Draw remaining contours
for cnt in cnts:box = cv2.minAreaRect(cnt)#最小外接矩形box = cv2.boxPoints(box)#4个顶点坐标box = np.array(box, dtype="int")box = perspective.order_points(box)#以左上、右上、右下和左下的顺序排列方块边框坐标(tl, tr, br, bl) = boxcv2.drawContours(image, [box.astype("int")], -1, (0, 0, 255), 2)mid_pt_horizontal = (tl[0] + int(abs(tr[0] - tl[0])/2), tl[1] + int(abs(tr[1] - tl[1])/2))mid_pt_verticle = (tr[0] + int(abs(tr[0] - br[0])/2), tr[1] + int(abs(tr[1] - br[1])/2))wid = euclidean(tl, tr)/pixel_per_cm ht = euclidean(tr, br)/pixel_per_cmcv2.putText(image, "{:.1f}cm".format(wid), (int(mid_pt_horizontal[0] - 15), int(mid_pt_horizontal[1] - 10)), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 0), 2)cv2.putText(image, "{:.1f}cm".format(ht), (int(mid_pt_verticle[0] + 10), int(mid_pt_verticle[1])), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 0), 2)show_images([image])
二、输出结果
三、参考资料
链接在此
【OpenCV】尺寸测量相关推荐
- 【计算机视觉OpenCV基础】实验四 尺寸测量
实验四 尺寸测量 计算机视觉OpenCV基础实验合辑(实验1234+扩展) 资源下载地址: https://download.csdn.net/download/weixin_53403301 合辑: ...
- opencv实战---物体尺寸测量
物体尺寸测量的思路是找一个确定尺寸的物体作为参照物,根据已知的计算未知物体尺寸. 如下图所示,绿色的板子尺寸为220*300(单位:毫米),通过程序计算白色纸片的长度. 目录 1.相关库 2.读图+图 ...
- python编程实现图片内多个物体尺寸测量
要实现图片内多个物体尺寸测量,你可以使用计算机视觉库,如 OpenCV 来实现. 首先,你需要读取图片,然后对图像进行预处理,以便更容易地检测到图像中的物体.例如,你可以使用边缘检测算法来提取边缘,或 ...
- 用 Python 和 OpenCV 来测量相机到目标的距离
用 Python 和 OpenCV 来测量相机到目标的距离 http://python.jobbole.com/84378/ 几天前,一个叫 Cameron 的 PyImageSearch 读者发来邮 ...
- 【Android 应用开发】Canvas 绘制文字 ( 文字尺寸测量 | 基线绘制 )
文章目录 I . 文字尺寸测量 II . 基线绘制 I . 文字尺寸测量 1 . 精准绘制需求 : Canvas 绘制文字时 , 有时需要精准的控制文字的绘制 , 如绘制到指定的区域 , 居中 , 或 ...
- halcon 定位_HALCON高级篇:单个相机的尺寸测量
点击上方"新机器视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 转自:AI图像 用单个相机在指定平面上的尺寸测量 在HALCON中 ...
- catia如何测量毛料尺寸_浅谈线束尺寸测量基准点的定义
在实际工作中,经常遇到这样的问题,线束图纸上面的设计尺寸很多时候标的比较粗糙,对线束尺寸测量的基准点定义不清晰,工艺这边经常搞不清楚到底从哪里开始测量?这将直接影响开线长度.到底包不包含连接器(接插件 ...
- HALCON示例程序measure_screw.hdev螺纹尺寸测量
HALCON示例程序measure_screw.hdev螺纹尺寸测量 示例程序源码(加注释) 关于显示类函数解释 dev_update_off () read_image (Image, 'screw ...
- HALCON示例程序measure_pump.hdev螺纹孔位置与尺寸测量
HALCON示例程序measure_pump.hdev螺纹孔位置与尺寸测量 示例程序源码(加注释) 关于显示类函数解释 dev_update_var ('off') dev_update_off () ...
- HALCON示例程序measure_metal_part_first_example.hdev通过拟合边缘进行尺寸测量
HALCON示例程序measure_metal_part_first_example.hdev通过拟合边缘进行尺寸测量 示例程序源码(加注释) 关于显示类函数解释 dev_update_off () ...
最新文章
- C语言,二维数组的逗号!_只愿与一人十指紧扣_新浪博客
- C# DateTimePicker控件如何精确设置显示时分秒
- python课程与c+课程有什么不同-南通渡课少儿编程:python和C的区别是什么?
- PieLove 之 数据分析帝.(ZZ)(is2120)
- 引导类、扩展类、系统类加载器的使用及演示
- css3 loading 效果1
- LeetCode 851. 喧闹和富有(拓扑排序)
- linux的码是什么东西,在Linux内核中的UD2操作码的目的是什么?
- 用VBA编写的简易计算器
- c#连接mysql数据库,增删查改命令执行
- Javascript经典窍门
- 力扣每日一刷--验证回文串
- Struts+HIbernate+Spring
- 为什么你应该开始学习编程了
- 关于ping与tracert网络命令详解
- 2021深圳杯d题数学建模 基于一个微分对策问题的机器学习能力定量评价
- 真爱,就要失去自己?
- VS2013中添加现有窗体项
- 解决:Error during artifact deployment. See server log for details.问题
- 面试最常问的设计模式
热门文章
- 网易云信 android,网易云信/NIM_Android_UIKit
- webpack打包处理字体文件
- 汪海Python爬虫(一)抓取网页的含义和URL基本构成
- 个人数据泄露问题的数据_非个人的个人数据
- 碰撞检测经典解决方案
- mysql:InnoDB关键特性:自适应哈希索引(AHI)
- MySQL倒计时查询剩余时间xx年xx月xx天
- 【SPFA】【最短路】 腾讯大战360
- 华为鸿蒙电视机65寸,华为电视65寸哪个型号性价比高_华为电视65寸哪个型号好...
- linux每个进程有4g,32位Linux单进程有4G内存限制