一,利用openCV的findContours轮廓查找功能,用已知物体的尺寸(比如硬币)作为参考,根据实际尺寸与像素尺寸的比列,求出图片中物体的实际大小。存在的问题有两个:

  • 图片的阴影导致轮廓不准确,除了多给点光之外没有想到怎么消除阴影。
  • 拍摄的角度要求垂直物体,这个也很难做到,可以靠工装固定,目前不知道怎么用算法来规避。

二,流程

三,代码

#include "stdafx.h"
#include <iostream>#include "opencv2/core/core.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/video/background_segm.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <opencv\cxcore.hpp>
#include <stdio.h>
using namespace std;
using namespace cv;Mat g_srcImage;
Mat g_grayImage;const int g_dReferWidth=19;//mm
double g_dPixelsPerMetric;
vector<vector<cv::Point>> g_vContours;
vector<Vec4i> g_vHierarchy;
bool g_bFirst=true;static cv::Point2f midpoint(cv::Point2f& ptA, cv::Point2f& ptB);//求中点
static float getDistance(Point2f pointA, Point2f pointB);//求距离
static bool ContoursSortFun(vector<cv::Point> contour1, vector<cv::Point> contour2);//按照 x坐标 排序
//-----------------------------------【main( )函数】--------------------------------------------
//      描述:控制台应用程序的入口函数,我们的程序从这里开始
//-------------------------------------------------------------------------------------------------
int main(int argc, const char** argv)
{system("color 1F");g_srcImage = imread("1.jpg", 1);//灰度 降低计算量cvtColor(g_srcImage, g_grayImage, COLOR_BGR2GRAY);//高斯滤波 降噪GaussianBlur(g_grayImage, g_grayImage, Size(7, 7), 0);imshow("高斯滤波", g_grayImage);//边缘检测Canny(g_grayImage, g_grayImage, 50,100);Mat element = getStructuringElement(MORPH_RECT, Size(15, 15)); //隔开物体dilate(g_grayImage, g_grayImage, element);//膨胀erode(g_grayImage, g_grayImage, element);//腐蚀imshow("形态学", g_grayImage);//寻找轮廓findContours(g_grayImage, g_vContours, g_vHierarchy, CV_RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);std::sort(g_vContours.begin(),g_vContours.end(), ContoursSortFun);//按照从左到右 排序for (unsigned i = 0; i < g_vContours.size(); i++) {if (contourArea(g_vContours[i]) < 100)//面积太小 则忽略continue;RotatedRect box = minAreaRect(g_vContours[i]);Point2f boxPoints[4];box.points(boxPoints);Point2f pointA = midpoint(boxPoints[0], boxPoints[1]);Point2f pointB = midpoint(boxPoints[1], boxPoints[2]);Point2f pointC = midpoint(boxPoints[2], boxPoints[3]);Point2f pointD = midpoint(boxPoints[3], boxPoints[0]);circle(g_srcImage, pointA, 2, Scalar(0, 0, 255));circle(g_srcImage, pointB, 2, Scalar(0, 0, 255));circle(g_srcImage, pointC, 2, Scalar(0, 0, 255));circle(g_srcImage, pointD, 2, Scalar(0, 0, 255));line(g_srcImage, pointA, pointC, Scalar(255, 0, 0));line(g_srcImage, pointD, pointB, Scalar(255, 0, 0));double dWidth = getDistance(pointA, pointC);double dHeight = getDistance(pointD, pointB);if (g_bFirst) {g_dPixelsPerMetric = dWidth/g_dReferWidth; //计算像素与 实际大小的比列cout << "pixelPerMetric:" << dWidth <<" "<< g_dReferWidth <<"  "<< g_dPixelsPerMetric;g_bFirst = false;}cout << "dWidth" << dWidth <<"   "<< dHeight<< "      "<<dWidth / g_dPixelsPerMetric<<"    "<< dHeight / g_dPixelsPerMetric;putText(g_srcImage, cv::format("(%.0f,%.0f)", dWidth/g_dPixelsPerMetric,dHeight/g_dPixelsPerMetric), boxPoints[2],FONT_HERSHEY_COMPLEX,0.5,Scalar(0,0,255));for (int i = 0; i <=3; i++){line(g_srcImage, boxPoints[i], boxPoints[(i + 1) % 4], Scalar(0, 255, 0));}}cv::namedWindow("效果", CV_WINDOW_AUTOSIZE);cv::imshow("效果", g_srcImage);waitKey(0);return 0;
}Point2f midpoint(Point2f& ptA, Point2f& ptB) {return Point2f((ptA.x+ ptB.x)*0.5,(ptA.y + ptB.y)*0.5);
}float getDistance(Point2f pointA, Point2f pointB)
{float distance;distance = powf((pointA.x - pointB.x), 2) + powf((pointA.y - pointB.y), 2);distance = sqrtf(distance);return distance;
}bool ContoursSortFun(vector<cv::Point> contour1, vector<cv::Point> contour2) {return  (contour1[0].x<contour2[0].x); // a.x < b.x;
}

四,效果

参考:使用OpenCV测量图像中物体的大小_-出发-的博客-CSDN博客_opencv测量物体尺寸

openCV 轮廓查找-测量物体尺寸相关推荐

  1. opencv 轮廓查找, 凸包,最小外接矩形,最小外接圆,最小外接椭圆

    本章内容: 1. 轮廓查找 2. 绘制轮廓 3. 凸包 4.最小外接矩形 5.最小外接圆 6.最小外接椭圆 1.搜索轮廓 2.绘制轮廓 输出结果 3.凸包 输出结果 4.最小外接矩形 输出结果 5.最 ...

  2. 【OAK开源项目教程】opencv+python实现测量包装盒尺寸和体积

    编辑:OAK中国 首发:oakchina.cn 喜欢的话,请多多

  3. 图像式物体尺寸测量算法设计

    目标:设计算法,根据一系列二维图像估计图中待测矩形物体的几何尺寸. 要求:误差小,运行速度快,占内存小,嵌入式平台,产品成本不能太高. 最近接到领导任务,要求评估根据二维图像测量物体尺寸的算法可行性. ...

  4. OpenCV测量物体的尺寸技能 get~

    点击上方"Python爬虫与数据挖掘",进行关注 回复"书籍"即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 盛年不重来,一日难再晨. 及时当勉 ...

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

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

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

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

  7. opencv测量物体的长度

    看代码前须知: 需要固定的摄像头来保证拍摄角度一致 需要固定的光源来保证受光面的一致 需要固定的检测物体来保证适应所设定的阈值(主要 灰度阈值) 需要知道一个物体实际的长度与像素之间的比值   方便做 ...

  8. python使用opencv查找轮廓_(八)OpenCV-Python学习—轮廓查找,绘制和拟合

    针对物体轮廓,opencv还提供了一些相关的函数,来处理轮廓查找,绘制,拟合,以及计算轮廓周长和面积等,详细介绍如下: 1. 寻找和绘制轮廓 opencv的findContours()能寻找图片中的轮 ...

  9. OpenCV的轮廓查找和填充

    OpenCV的轮廓查找有C版本和C++版本,当轮廓比较复杂的时候,例如嵌入多层轮廓,如果方法不当那么很容易会漏处理一些轮廓.本文介绍了复杂轮廓场景下的几种主要的查找轮廓和颜色填充方法. 1:cvFin ...

最新文章

  1. python怎么导入同一包的模块
  2. 服务器双系统切换快捷键,服务器双系统同时开
  3. Java,开源,分享
  4. rabittmq java spring_消息队列 RabbitMQ 与 Spring 整合使用的实例代码
  5. java scanner字符串_Java Scanner toString()用法及代码示例
  6. 把日志文件从Linux服务器拷贝到Windows上
  7. 65 modol1用户登录
  8. 1.4.在TypeScript中使用JQuery
  9. java 任务池_多线程的应用-异步任务线程池的简单实现
  10. JavaScript语言精粹 ——笔记
  11. python多进程用不了_Python多进程相关的坑
  12. AngularJs的UI组件ui-Bootstrap分享(七)——Buttons和Dropdown
  13. linux固定dns怎么设置,Linux之如何进行固定IP、DNS等设置
  14. center os php,Center OS 7 Apache安装配置
  15. 如何建设可视化集中管理平台
  16. 万维网联盟(W3C)创立了 WWW 标准
  17. Linux系统管理干货总结笔记
  18. 电脑开飞行模式为什么还可以上网?
  19. 四大服务器系统,四大厂商八路服务器横向对比 谁是王者?
  20. 自动驾驶数据闭环系列之一:理想丰满,现实骨感

热门文章

  1. 【完结】中国12大AI研究院,高调的低调的你pick谁
  2. 某×××运营推广策划案
  3. 利用WireShark进行DNS协议分析
  4. [IOS开发教程] ios开发培训:浅析最方便的iOS开发环境
  5. HDU 5371 Hotaru's problem(Manacher算法+贪心)
  6. [C语言]——输入年份月份求天数
  7. 移动4g有信号无法连接服务器,在门口有4G的信号,但是进了房间里就没有了,上网都连不上。怎么避免这种情况?...
  8. Python的PyYAML模块详解
  9. ObjectARX如何判断点和多段线的关系
  10. 医学类职业适应性测试题用哪个软件,职业适应性测试题库 性格职业适应性测试.doc...