文章目录

  • 前言
  • 一、代码分析
  • 二、输出结果
  • 三、参考资料

前言

需要一个已经知道尺寸的物体作为参考。
物体实际宽度/照片中物体的宽度=参考物实际宽度/照片中参考物的宽度
下图左上角方框为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】尺寸测量相关推荐

  1. 【计算机视觉OpenCV基础】实验四 尺寸测量

    实验四 尺寸测量 计算机视觉OpenCV基础实验合辑(实验1234+扩展) 资源下载地址: https://download.csdn.net/download/weixin_53403301 合辑: ...

  2. opencv实战---物体尺寸测量

    物体尺寸测量的思路是找一个确定尺寸的物体作为参照物,根据已知的计算未知物体尺寸. 如下图所示,绿色的板子尺寸为220*300(单位:毫米),通过程序计算白色纸片的长度. 目录 1.相关库 2.读图+图 ...

  3. python编程实现图片内多个物体尺寸测量

    要实现图片内多个物体尺寸测量,你可以使用计算机视觉库,如 OpenCV 来实现. 首先,你需要读取图片,然后对图像进行预处理,以便更容易地检测到图像中的物体.例如,你可以使用边缘检测算法来提取边缘,或 ...

  4. 用 Python 和 OpenCV 来测量相机到目标的距离

    用 Python 和 OpenCV 来测量相机到目标的距离 http://python.jobbole.com/84378/ 几天前,一个叫 Cameron 的 PyImageSearch 读者发来邮 ...

  5. 【Android 应用开发】Canvas 绘制文字 ( 文字尺寸测量 | 基线绘制 )

    文章目录 I . 文字尺寸测量 II . 基线绘制 I . 文字尺寸测量 1 . 精准绘制需求 : Canvas 绘制文字时 , 有时需要精准的控制文字的绘制 , 如绘制到指定的区域 , 居中 , 或 ...

  6. halcon 定位_HALCON高级篇:单个相机的尺寸测量

    点击上方"新机器视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 转自:AI图像 用单个相机在指定平面上的尺寸测量 在HALCON中 ...

  7. catia如何测量毛料尺寸_浅谈线束尺寸测量基准点的定义

    在实际工作中,经常遇到这样的问题,线束图纸上面的设计尺寸很多时候标的比较粗糙,对线束尺寸测量的基准点定义不清晰,工艺这边经常搞不清楚到底从哪里开始测量?这将直接影响开线长度.到底包不包含连接器(接插件 ...

  8. HALCON示例程序measure_screw.hdev螺纹尺寸测量

    HALCON示例程序measure_screw.hdev螺纹尺寸测量 示例程序源码(加注释) 关于显示类函数解释 dev_update_off () read_image (Image, 'screw ...

  9. HALCON示例程序measure_pump.hdev螺纹孔位置与尺寸测量

    HALCON示例程序measure_pump.hdev螺纹孔位置与尺寸测量 示例程序源码(加注释) 关于显示类函数解释 dev_update_var ('off') dev_update_off () ...

  10. HALCON示例程序measure_metal_part_first_example.hdev通过拟合边缘进行尺寸测量

    HALCON示例程序measure_metal_part_first_example.hdev通过拟合边缘进行尺寸测量 示例程序源码(加注释) 关于显示类函数解释 dev_update_off () ...

最新文章

  1. C语言,二维数组的逗号!_只愿与一人十指紧扣_新浪博客
  2. C# DateTimePicker控件如何精确设置显示时分秒
  3. python课程与c+课程有什么不同-南通渡课少儿编程:python和C的区别是什么?
  4. PieLove 之 数据分析帝.(ZZ)(is2120)
  5. 引导类、扩展类、系统类加载器的使用及演示
  6. css3 loading 效果1
  7. LeetCode 851. 喧闹和富有(拓扑排序)
  8. linux的码是什么东西,在Linux内核中的UD2操作码的目的是什么?
  9. 用VBA编写的简易计算器
  10. c#连接mysql数据库,增删查改命令执行
  11. Javascript经典窍门
  12. 力扣每日一刷--验证回文串
  13. Struts+HIbernate+Spring
  14. 为什么你应该开始学习编程了
  15. 关于ping与tracert网络命令详解
  16. 2021深圳杯d题数学建模 基于一个微分对策问题的机器学习能力定量评价
  17. 真爱,就要失去自己?
  18. VS2013中添加现有窗体项
  19. 解决:Error during artifact deployment. See server log for details.问题
  20. 面试最常问的设计模式

热门文章

  1. 网易云信 android,网易云信/NIM_Android_UIKit
  2. webpack打包处理字体文件
  3. 汪海Python爬虫(一)抓取网页的含义和URL基本构成
  4. 个人数据泄露问题的数据_非个人的个人数据
  5. 碰撞检测经典解决方案
  6. mysql:InnoDB关键特性:自适应哈希索引(AHI)
  7. MySQL倒计时查询剩余时间xx年xx月xx天
  8. 【SPFA】【最短路】 腾讯大战360
  9. 华为鸿蒙电视机65寸,华为电视65寸哪个型号性价比高_华为电视65寸哪个型号好...
  10. linux每个进程有4g,32位Linux单进程有4G内存限制