2017-5-31:花了一个礼拜的时间,通过网上各种找资料,自己独自完成了一个简单的集装箱号码识别的小程序;

网上大多资料都是车牌号码识别,集装箱号码可能所处的环境因素会复杂一点,比如号码横竖问题、拍摄角度不同、号码字体不同...但总体框架还是和车牌识别一个道理的;能力有限很多因素都没考虑进来,暑假有机会的话希望能进一步研究一下,这先做个小小总结以防时间久了想复习一下都不知道从哪抓起;

1 获取号码区域

集装箱号码类似与文字区域的检测,先使用 morphologyEx函数膨胀,再用 cvFindContours 函数提取轮廓;

集装箱号码的排列一般分横型和竖型,所以膨胀处理也对应两种

// 寻找所有矩形轮廓
// 参数:
// 1. pBinary: 输入二值图像,单通道,位深IPL_DEPTH_8U。
// 2. Size s: 横竖形态选择参数
vectorFindRect(IplImage *src_img, Size s)
{
vectorRectbuf;
IplImage *gray_img = cvCreateImage(cvGetSize(src_img), 8, 1);
cvSmooth(src_img, src_img, CV_GAUSSIAN);    //IplI *arr转mat:mat(arr)
cvCvtColor(src_img, gray_img, CV_BGR2GRAY);
double th_maxArea = (gray_img->width*gray_img->height)*0.5;
double th_minArea = (gray_img->width*gray_img->height)*0.01;
double th_maxRatio = 0.3;  //height/width比
double th_minRatio = 0.01;
Mat element1 = getStructuringElement(MORPH_RECT, s);
//morphologyEx(cvarrToMat(gray_img), cvarrToMat(gray_img), MORPH_CLOSE, element1);
morphologyEx(cvarrToMat(gray_img), cvarrToMat(gray_img), MORPH_DILATE, element1);
IplImage *pBinary = cvCreateImage(cvGetSize(gray_img), 8, 1);
int thresh = Otsu(gray_img);
cvThreshold(gray_img, pBinary, thresh, 255, CV_THRESH_BINARY);
//cvAdaptiveThreshold(gray_img, pBinary, 255, CV_ADAPTIVE_THRESH_MEAN_C, CV_THRESH_BINARY, 5, 5);
CvSeq *pContour = NULL;
CvMemStorage *pStorage = NULL;
//IplImage *dst = cvCreateImage(cvGetSize(gray_img), 8, 3);
// 执行条件
if (pBinary)
{
// 查找所有轮廓
pStorage = cvCreateMemStorage(0);
cvFindContours(pBinary, pStorage, &pContour, sizeof(CvContour), CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE);
int cnt = 0;
CvContourScanner scanner = cvStartFindContours(pBinary, pStorage);
while (pContour = cvFindNextContour(scanner))
{
//double tmparea = fabs(cvContourArea(pContour));
CvRect rect = cvBoundingRect(pContour, 0);
double tmparea = rect.height*rect.width;   //面积筛选
if (tmparea < th_minArea || tmparea > th_maxArea)
{
cvSubstituteContour(scanner, NULL);//删除当前的轮廓
continue;
}
double tmpRatio = (rect.heightth_maxRatio)//长宽比筛选
{
cvSubstituteContour(scanner, NULL);//删除当前的轮廓
continue;
}
cnt++;
Rectbuf.push_back(rect);
//cvDrawContours(src_img, pContour, CV_RGB(0, 0, 255), CV_RGB(0, 0, 255), 0, 2, CV_FILLED, cvPoint(0, 0));
cvRectangle(src_img, cvPoint(rect.x, rect.y), cvPoint(rect.x + rect.width, rect.y + rect.height), CV_RGB(255, 0, 0), 1, 8, 0);
}
pContour = cvEndFindContours(&scanner);
cout << Rectbuf.size() << endl;
cvReleaseMemStorage(&pStorage);
pStorage = NULL;
}
cvNamedWindow("result");
cvShowImage("result", src_img); waitKey();
destroyWindow("result");
cvReleaseImage(&pBinary);
cvReleaseImage(&gray_img);
return Rectbuf;
}

2 确定单个字符

3 识别字符

简单的集装箱号码识别相关推荐

  1. 看集装箱号码识别技术如何解决港口拥堵

    什么是港口拥堵? 当船舶到港但港口容量已达上限,船舶无法装卸时,就会发生港口拥堵.此时船舶可以排队等待,也可以选择挂靠附近的港口. 港口拥堵的原因是什么? 原因有很多:首先是承运人严格的运力管理和增加 ...

  2. 集装箱号码识别技术在港口的应用

    随着我国经济的发展,港口集装箱吞吐量增速加快,如何快速处理集装箱信息成为业内关注的焦点.目前,我国主要大型港口企业正加紧开展智能化港口系统设计.规划和建设工作.在传统港口作业模式下,集装箱场站是进出口 ...

  3. 集装箱号码OCR识别SDK在港口理货系统中的应用

    1. 项目背景 随着现代科技的发展,各个港口.码头对于进出的集装箱管理也从传统的人工手写登记,到现在的电子理货系统,但是在如何提高工作人员的理货效率.出现错误进行溯源上,各港口.码头对于人员的要求也越 ...

  4. 《熟练掌握OpenCV----实用计算机视觉工程案例》第5章 车牌号码识别

    人工智能系列经典图书翻译 原   名:<Mastering OpenCV with Practical Computer Vision Projects> 作   者:Shervin Em ...

  5. python的快车智能车牌号码识别系统的开发

    It is not always possible to prove some crimes. To achieve this, modern tools may be needed which mu ...

  6. (转)Asterisk模拟线FXO的主叫号码识别(来电显示)

    CID (CallerID,CLID,主叫号码,来电显示)是在实际使用中常遇到的另外一个常见问题,主叫号码格式分为FSK(美规)或DTMF方式.主叫号码可能会在第一声振铃之前送过来,也可能在第一声振铃 ...

  7. 【身份证识别】基于matlab GUI身份证号码识别【含Matlab源码 014期】

    ⛄一.身份证号码识别简介 1 引言 作为居民身份的象征,身份证是居民身份的唯一标识,它已成为生活中必不可少的证件.在火车站.酒吧等公共场所,流动人口大人员复杂,警察需要对公民的身份证进行核对,排除可疑 ...

  8. 原创:谈谈计算机图像识别技术之身份证号码识别

    原创:谈谈计算机图像识别技术之身份证号码识别 作者:刘常军(2014-1-21)   前两天看到一篇文章,说支付宝钱包的iOS版和Android版已经升至8.0,只要通过摄像头对准银行卡进行扫描,支付 ...

  9. 号牌号码识别,支持新能源车牌,离线识别,喜欢就收下吧

    号牌号码识别,支持新能源车牌,离线识别 我的项目地址: https://github.com/ccc920123/LicensePlateDemo 如果喜欢记得标星哟!!! 号牌识别,支持新能源车,离 ...

最新文章

  1. Spring @Scheduled
  2. 参加金蝶OperaMasks-WebFramework成都推广活动后的感想
  3. JAVA基础知识(4)
  4. C#为什么支持协变的参数只能用于方法的返回值?支持逆变的参数只能用于方法参数?...
  5. win7-64bit下基于VMware12.5安装rhel-server-6.3-i386
  6. html重绘text,使用DrawText重绘C++
  7. C语言实实验步骤,C语言教程学习方法攻略
  8. Hive、Spark优化案例
  9. 动软分享社区系统 v1.6 震撼发布!
  10. MSXML版本6.10.1129.0
  11. JRE解压缩后手动配置注册表
  12. 网络系统管理赛项之Debian七. 2021年全国职业院校技能大赛将挑选各省1人或1组队伍参赛
  13. 围棋规则的计算机实现
  14. make VERBOSE=1等的作用
  15. 【pyqt5】自定义控件 实现能够保持长宽比地缩放子控件
  16. html5中英文间自动空格,如何快速在文章中英文数字间自动添加空格
  17. 一日一命令:find 命令详解
  18. 8位无符号比较器设计
  19. 安装SQL Server 2008 及 VS 2008
  20. 计算机教师格言座右铭,教师个人格言座右铭集锦

热门文章

  1. 两道非常容易理解错的OSPF问题. 加深理解LSA的概念和ABR/ASBR的概念.
  2. uni-app学习 style样式和三元运算符用法(三)
  3. unity之摇杆和NPC
  4. 一个屌丝程序员的青春(一三二)
  5. linux下划线后面加变量名,Shell中下划线_与变量的关系
  6. 使用集成学习提升机器学习算法性能
  7. 乌镇互联网大会部分嘉宾分享要点实录
  8. mSystems:土壤化学计量特性影响土壤C、N和P循环微生物丰度及其对全球变化的抵抗力(一作解读)...
  9. 深度学习mindspore --- win10系统cpu下安装mindspore
  10. Java入门(四)JAVA SE 02