C++实现钢管计数

目前钢管计数主要采用人工计数,既繁琐又易错,同时在实际生产中,由于实际尺寸与理论设计之间存在一定的误差, 如果按照重量计算,会造成一定的销售成本损失, 因此实现对棒材的生产成品进行准确计数具有重要的现实意义。 本算法主要针对捆扎钢管, 拍摄钢管截面图像(尽量减少遮挡),通过识别钢管内部阴影的个数实现钢管辅助计数。 由于依赖二值化图像的质量,所以对光照要求较高,存在一定的误识别,  算法主要分为两个部分:
1. 图像二值化。也就是得到质量良好的截面区域。使用带有上下限(需根据场景手动设置)的二值化方法,去除深色背景( Threshhold1 )和除钢管阴影以外的亮区域( Threshhold2 )对 ROI (感兴趣) 区域的干扰。
2. 提取目标连通区域轮廓。 经形态学开运算处理后,去除噪声点和独立小点特大区域的干扰, 分割出目标连通区域后, 提取所有连通区域的边界点。 其中连通区域的面积选择根
据经验设置。
3. 统计连通区域的圆特性。以连通区域的最小外接圆半径作为期望没计算轮廓上个点到圆心距离的方差来确定是否为类圆。 方差可信度的范围根据图像的效果进行手动设置。

下面是实现的代码:

// selectshape.cpp : 选择轮廓
//二值化的结果是识别的关键,提取出所有圆形区域,后面通过调节类圆的方差阈值,连通区域的大小可以提高识别率
#include "stdafx.h"
#include <iostream>


#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"


#include "opencv2/imgproc/imgproc.hpp"
using namespace std;
using namespace cv;
#define  VP  vector<Point>  //用VP符号代替 vector<point>
RNG  rng(12345);
//带有上下限的threshold
void threshold2(Mat gray,Mat& thresh,int minvalue,int maxvalue)
{
Mat thresh1;
Mat thresh2;
//二值化 阈值为43
//THRESH_BINARY  当前点值大于阈值时,取Maxval,否则设置为0
threshold(gray,thresh1,43,255, THRESH_BINARY);
//?
//THRESH_BINARY_INV 当前点值大于阈值时,设置为0,否则设置为Maxval
threshold(gray,thresh2,111,255,THRESH_BINARY_INV);
thresh = thresh1 & thresh2;
}


//寻找并绘制出联通区域-----------------------------------------------------------------------此处出现大部分错误联通区域导致圆识别失败
vector<VP> connection2(Mat src,Mat& draw)
{    
draw = Mat

  • 7
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值