基于OpenCV的条形码区域检测(五)
来源:互联网 发布:券商资管新规 知乎 编辑:程序博客网 时间:2024/05/16 01:30
基于OpenCV的条形码区域检测(五)
在上一篇中,将分好区块的图片进行了Sobel,并滤除了纹理的干扰,得到了每个区块的角度信息,以及各个区块中有效像素点总数,但是只有这些还不能够直接判断哪一个区块内存在条形码,还需要做些处理。
以下代码为遍历每块区块,并计算其有效像素点占像素总数的比例,以便后面排除干扰区块的影响。
///获得直方图中值最高的项,并返回其与相邻项的和long getMaxWithAdj(long* hist, int &index) { long max = 0; int maxindex = 0; for (int i = 0; i < 8; ++i) { if (hist[i] > max) { max = hist[i]; maxindex = i; } } index = maxindex; return hist[(maxindex - 1) % 8] + hist[maxindex] + hist[(maxindex + 1) % 8]; //long *newHist = new long[8]; //for (int i = 0; i < 8; ++i) { // newHist[i] = hist[(i - 1) % 8] + hist[i] + hist[(i + 1) % 8]; //} //long max = 0; //int maxindex = 0; //for (int i = 0; i < 8; ++i) { // if (newHist[i] > max) { // max = newHist[i]; // maxindex = i; // } //} //index = maxindex; //long val = newHist[maxindex]; //if (newHist) { // delete newHist; //} //newHist = NULL; //return val;}///计算所有区块的分数void blockSetTravel() { ///遍历所有区块 for (vector<BlockInfo >::iterator pb = g_blockSet.begin(); pb < g_blockSet.end(); ++pb) { int maxIndex = 0; ///获得最高的项的和 long max = getMaxWithAdj(pb->angleHist, maxIndex); pb->direction = maxIndex; if (pb->count > pb->height*pb->width / 20.0) { if (pb->count > 0) ///该区块的得分 pb->score = max*1.0 / pb->count*1.0; else pb->score = 0; } else { pb->score = 0; } }}
以上注释部分代码为使用相邻方向总和来定位最高项的尝试,但是最终发现在测试图片中,效果没有直接取得最高项,并返回其相邻方向的总和的方式明显。可能与测试图片相关,可以根据不同应用场景变更。
接着就是根据所有区块的方向信息统计并得到大概的整个可能的条形码区域的方向。
///计算所有区块的总体方向,即整个条形码的大概方向范围在PI的哪一个1/8等分中int getDirection() { int direction[8]; memset(direction, 0, sizeof(int) * 8); ///认为非干扰区块的阈值 const float SCORE_THRESHOLD = 0.65; for each(auto var in g_blockSet) { if (var.score >= SCORE_THRESHOLD) { direction[var.direction]++; } } int max = 0; int maxIndex; for (int i = 0; i < 8; ++i) { if (direction[i] > max) { max = direction[i]; maxIndex = i; } } return maxIndex;}
接下来,使用上面得到的方向在相同尺寸的图片上绘制出来,效果如图
可以看出,这就是图片上的条形码的区域
绘制该区域的代码如下:
///将指定方向的区块根据梯度强度强弱或深或浅绘制Mat drawBlockSet(Size size, int direction) { Mat result(size, CV_8U, Scalar(0, 0, 0)); for (vector<BlockInfo >::iterator pvar = g_blockSet.begin(); pvar < g_blockSet.end(); ++pvar) { if (pvar->score >= 0.65 && pvar->direction == direction) { pvar->exist = true; rectangle(result, Rect(pvar->leftTop.x, pvar->leftTop.y, pvar->width, pvar->height), Scalar(255 * pvar->score), -1); } else { pvar->exist = false; } } return result;}
接下来要做的就是将该区域的精确的角度求出,如果只是需要条形码的位置,那么求出角度便可以满足要求了。但是如果需要正的条形码的图片,还需将原图片裁剪旋转。且见下回分解!
0 0
- 基于OpenCV的条形码区域检测(五)
- 基于OpenCV的条形码区域检测(完)
- 基于OpenCV的条形码区域检测(一)
- 基于OpenCV的条形码区域检测(二)
- 基于OpenCV的条形码区域检测(三)
- 基于OpenCV的条形码区域检测(四)
- 条形码区域的提取--python(opencv)
- opencv程序十九:基于帧间差分法的区域目标入侵检测
- OpenCV 检测图片上的条形码
- 基于OpenCV的火焰检测(五)——两个颜色模型的主分量判据
- 基于opencv的肤色检测,并将肤色区域用矩形框标出。
- 用 Python 和 OpenCV 检测图片上的条形码
- 用 Python 和 OpenCV 检测图片上的条形码
- 用 Python 和 OpenCV 检测图片上的条形码
- 用 Python 和 OpenCV 检测图片上的条形码
- 用 Python 和 OpenCV 检测图片上的条形码
- 使用Python和OpenCV检测图片上的条形码
- 检测图片上的条形码 Python 和 OpenCV
- 数据结构--静态链表
- POJ 1144
- Linux基本教程————Linux软件安装之Yum,源码编译安装
- 怎样改变Myeclipse中控制台的字体大小
- ExecutorService中submit和execute的区别
- 基于OpenCV的条形码区域检测(五)
- 【编程知识】面向对象基础知识总结
- C语言习题——编写一个程序,生产一个乘法表
- 排序算法(七)海量数据的排序问题
- 阿里云的CentOS环境中安装配置MySQL的教程
- 信息论与编码题库
- 汇编第二次试验
- vi / vim 编辑器的基本使用介绍
- PHP + mysql 对日期的操作