资源简介
利用opencv实现简单的条形码检测与识别-C++语言实现。利用opencv实现简单的条形码检测与识别-C++语言实现。利用opencv实现简单的条形码检测与识别-C++语言实现。
代码片段和文件信息
#include
#include
#include
using namespace cv;
using namespace std;
using namespace zbar;
int main(int argcchar* argv[])
{
char fileNameString[100];
char windowNameString[50];
char resultFileNameSring[100];
Mat srcImagegrayImageblurImagethresholdImagegradientXImagegradientYImagegradientImagemorphImage;
for (int fileCount = 1;fileCount < 8;fileCount++)
{
sprintf(fileNameString“F:\\opencv\\条形码检测与识别\\barcode_0%d.jpg“fileCount);
sprintf(windowNameString“result 0%d“fileCount);
sprintf(resultFileNameSring“F:\\opencv\\条形码检测与识别\\barcodeResult_0%d.jpg“fileCount);
//读取图像
srcImage = imread(fileNameString);
if(srcImage.empty())
{
cout<<“image file read error“<
return -1;
}
//图像转换为灰度图像
if(srcImage.channels() == 3)
{
cvtColor(srcImagegrayImageCV_RGB2GRAY);
}
else
{
grayImage = srcImage.clone();
}
//建立图像的梯度幅值
Scharr(grayImagegradientXImageCV_32F10);
Scharr(grayImagegradientYImageCV_32F01);
//因为我们需要的条形码在需要X方向水平所以更多的关注X方向的梯度幅值而省略掉Y方向的梯度幅值
subtract(gradientXImagegradientYImagegradientImage);
//归一化为八位图像
convertScaleAbs(gradientImagegradientImage);
//看看得到的梯度图像是什么样子
//imshow(windowNameStringgradientImage);
//对图片进行相应的模糊化使一些噪点消除
blur(gradientImageblurImageSize(99));
//模糊化以后进行阈值化得到到对应的黑白二值化图像二值化的阈值可以根据实际情况调整
threshold(blurImagethresholdImage210255THRESH_BINARY);
//看看二值化图像
//imshow(windowNameStringthresholdImage);
//二值化以后的图像条形码之间的黑白没有连接起来就要进行形态学运算消除缝隙相当于小型的黑洞选择闭运算
//因为是长条之间的缝隙所以需要选择宽度大于长度
Mat kernel = getStructuringElement(MORPH_RECTSize(217));
morphologyEx(thresholdImagemorphImageMORPH_CLOSEkernel);
//看看形态学操作以后的图像
//imshow(windowNameStringmorphImage);
//现在要让条形码区域连接在一起所以选择膨胀腐蚀而且为了保持图形大小基本不变应该使用相同次数的膨胀腐蚀
//先腐蚀让其他区域的亮的地方变少最好是消除然后膨胀回来消除干扰迭代次数根据实际情况选择
erode(morphImage morphImage getStructuringElement(MORPH_RECT Size(33))Point(-1-1)4);
dilate(morphImage morphImage getStructuringElement(MORPH_RECT Size(33))Point(-1-1)4);
//看看形态学操作以后的图像
//imshow(windowNameStringmorphImage);
vector>contours;
vectorcontourArea;
//接下来对目标轮廓进行查找目标是为了计算图像面积
findContours(morphImagecontoursRETR_EXTERNALCHAIN_APPROX_SIMPLE);
//计算轮廓的面积并且存放
for(int i = 0; i < contours.size();i++)
{
contourArea.push_back(cv::contourArea(contours[i]));
}
//找出面积最大的轮廓
double maxValue;Point maxLoc;
minMaxLoc(contourArea NULL&maxValueNULL&maxLoc);
//计算面积最大的轮廓的最小的外包矩形
RotatedRect minRect = minAreaRect(contours[maxLoc.x]);
//为了防止找错要检查这个矩形的偏斜角度不能超标
//如果超标那就是没找到
if(minRect.angle<2.0)
{
//找到了矩形的角度但是这是一个旋转矩形所以还要重新获得一个外包最小矩形
Rect myRect = boundingRect(contours[maxLoc.x]);
//把这个矩形在源图像中画出来
//rectangle(srcImagemyRectScalar(0255255)3LINE_AA);
//看看显示效果找的对不对
//imshow(windowNameStringsrcImage);
//将扫描的图像裁剪下来并保存为相应的结果保留一些X方向的边界所以对rec
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
目录 0 2019-12-29 11:59 利用opencv实现的条形码检测与识别(C++)\
文件 122315 2016-03-11 14:53 利用opencv实现的条形码检测与识别(C++)\barcode_01.jpg
文件 104680 2016-03-11 16:27 利用opencv实现的条形码检测与识别(C++)\barcode_02.jpg
文件 119950 2016-03-11 16:27 利用opencv实现的条形码检测与识别(C++)\barcode_03.jpg
文件 118024 2016-03-11 16:27 利用opencv实现的条形码检测与识别(C++)\barcode_04.jpg
文件 109951 2016-03-11 16:27 利用opencv实现的条形码检测与识别(C++)\barcode_05.jpg
文件 120404 2016-03-11 16:27 利用opencv实现的条形码检测与识别(C++)\barcode_06.jpg
文件 42683 2014-11-18 04:10 利用opencv实现的条形码检测与识别(C++)\barcode_07.jpg
文件 4877 2016-03-15 10:40 利用opencv实现的条形码检测与识别(C++)\main.cpp
- 上一篇:各种语言编写的pcm代码
- 下一篇:编译原理 压缩文法等价变换
相关资源
- Opencv2.4.12 SVM手写数字识别
- opencv 正脸+左右侧脸全检测
- 激光雷达数据读取、显示、分割、直
- CvvImage类库
- 基于opencv的C++人眼识别以及眨眼检测
- 在VS2012上基于opencv的C++人眼识别与眨
- 基于暗通道和导向滤波的图像去雾算
- 根据原图和二值图得到分割彩图
- qt界面化实现各种滤波函数
- c#通过dll读取opencv里的mat图片
- linux opencv车牌识别
- opencv多视频同一窗口显示C++程序
- 基于opencv的手势识别
- 利用opencv做的垃圾检测代码
- Opencv3.0 鱼眼相机标定fisheye
- LSD直线提取算法Opencv
- 使用vc++6.0调用opencv库函数生成5*5单位
- opencv绘制点与坐标系
- 基于socket和opencv在linux中实现摄像头实
- 图片浏览器实现和图像编辑器实现源
- danmu 基于opencv平台编写的单目相机标
- OpenCV边缘检测程序 by浅墨
- c++视频教程opencv视频图像处理机器视
- OpenCV单目视觉定位测量C++代码
- YUV数据转换成opencv的Mat的RGB<
- 一种多尺度检测的KCF的python实现代码
- c++二维码识别opencv+zbar
- 图像识别细胞检测与计数系统vc源码
- 通过封装的opencv函数进行yuv.nv12到jp
- OpenCV 中文API官方帮助文档.rar
评论
共有 条评论