条形码识别项目中C++以及OpenCV基础知识
2017-08-07 10:05
417 查看
1、循环创建文件夹并且在文件夹中写入东西(C++)
imwrite只能保存到已知的文件夹目录,若文件夹目录不是已知的,在C++中可以添加CreateDirectory(filename, NULL);语句来建立已知的文件夹,其中filename是char类型。循环保存文件夹或者图像时:
sprintf(savefilename, "C:/Users/SLJ/Desktop/TestImage/pic%d/%d.bmp", num, i);
2、对vector元素进行排序(C++)
假设定义了一个vector,vector<float> TheTa;用sort可对vector中的数据进行简单排序,std::sort(TheTa.begin(), TheTa.end());
3、在VS中对所有想要替换的文本进行替换:(C++)
首先找文本control+F,出现如下图所示,下标点击Find In Files。然后点击至Replace in Files,输入要替换的参数。
点击Replace All。
4、在VS中进行include配置时,需要注意的是是否在上一级文件夹中。用#include 加载头文件时,"./"表示当前目录,"../"表示当前目录的上一级目录。在字符串中,'\'是转义字符,要表示'\',在字符串中应写为'\\',因此"../A/B/C.exe"与 "..\\A\\B\\C.exe"等价。
5、如果对于在一个文件夹下,既要包含Include,lib,又要包含项目内容,如下图所示:(C++)
有可能在配置的过程中引发错误。include可以配置为..\..\Include;lib可以配置为..\..\lib;但是之前根据配置OpenCV一劳永逸的方法我们默认Opencv的Include在文件夹C:\OpenCV-3.2.0\opencv\build\include,而默认的lib是在文件夹C:\OpenCV-3.2.0\opencv\build\x86\vc14\lib下。这样会导致配置文件紊乱,编译器不知道去读取哪个配置文件里面的function。解决方法是重新Property
Manager进行重新配置include和lib,将之前的路径删除。
6、条码识别类的封装(C++)
将小功能的函数放在private中,对外不可见。将这些小功能的函数组合成大功能的函数,外界需要访问,放在public中,参数设置也需要放置在public中,可以通过外界设置。头文件BarDetection.h存放如下图所示:
在BarDetection.cpp中写入函数的实现方式,每个需要实现的小功能都能添加注解:函数名称,函数功能,输入参数,输出参数,注意事项。如下图所示:
7、Canny算子(OpenCV)
图像边缘检测算法的原理:检测出图像中所有灰度值变化较大的点,而且这些点连接起来就构成了若干线条,这些线条就可以称为图像的边缘。Canny(const CvArr* image, CvArr* edges, double threshold1, double threshold2, int aperture_size = 3)。
第一个参数表示输入图像,必须位单通道灰度图像。
第二个参数表示输出的边缘图像,为单通道黑白图。
第三个参数和第四个参数表示阈值。如果某一像素位置的幅值超过 高 阈值, 该像素被保留为边缘像素。如果某一像素位置的幅值小于 低 阈值, 该像素被排除。比例最好是1:2或者1:3
第五个参数表示Sobel 算子大小,默认为3即表示一个3*3的矩阵。
imwrite只能保存到已知的文件夹目录,若文件夹目录不是已知的,在C++中可以添加CreateDirectory(filename, NULL);语句来建立已知的文件夹,其中filename是char类型。循环保存文件夹或者图像时:
sprintf(savefilename, "C:/Users/SLJ/Desktop/TestImage/pic%d/%d.bmp", num, i);
2、对vector元素进行排序(C++)
假设定义了一个vector,vector<float> TheTa;用sort可对vector中的数据进行简单排序,std::sort(TheTa.begin(), TheTa.end());
3、在VS中对所有想要替换的文本进行替换:(C++)
首先找文本control+F,出现如下图所示,下标点击Find In Files。然后点击至Replace in Files,输入要替换的参数。
点击Replace All。
4、在VS中进行include配置时,需要注意的是是否在上一级文件夹中。用#include 加载头文件时,"./"表示当前目录,"../"表示当前目录的上一级目录。在字符串中,'\'是转义字符,要表示'\',在字符串中应写为'\\',因此"../A/B/C.exe"与 "..\\A\\B\\C.exe"等价。
5、如果对于在一个文件夹下,既要包含Include,lib,又要包含项目内容,如下图所示:(C++)
有可能在配置的过程中引发错误。include可以配置为..\..\Include;lib可以配置为..\..\lib;但是之前根据配置OpenCV一劳永逸的方法我们默认Opencv的Include在文件夹C:\OpenCV-3.2.0\opencv\build\include,而默认的lib是在文件夹C:\OpenCV-3.2.0\opencv\build\x86\vc14\lib下。这样会导致配置文件紊乱,编译器不知道去读取哪个配置文件里面的function。解决方法是重新Property
Manager进行重新配置include和lib,将之前的路径删除。
6、条码识别类的封装(C++)
将小功能的函数放在private中,对外不可见。将这些小功能的函数组合成大功能的函数,外界需要访问,放在public中,参数设置也需要放置在public中,可以通过外界设置。头文件BarDetection.h存放如下图所示:
在BarDetection.cpp中写入函数的实现方式,每个需要实现的小功能都能添加注解:函数名称,函数功能,输入参数,输出参数,注意事项。如下图所示:
7、Canny算子(OpenCV)
图像边缘检测算法的原理:检测出图像中所有灰度值变化较大的点,而且这些点连接起来就构成了若干线条,这些线条就可以称为图像的边缘。Canny(const CvArr* image, CvArr* edges, double threshold1, double threshold2, int aperture_size = 3)。
第一个参数表示输入图像,必须位单通道灰度图像。
第二个参数表示输出的边缘图像,为单通道黑白图。
第三个参数和第四个参数表示阈值。如果某一像素位置的幅值超过 高 阈值, 该像素被保留为边缘像素。如果某一像素位置的幅值小于 低 阈值, 该像素被排除。比例最好是1:2或者1:3
第五个参数表示Sobel 算子大小,默认为3即表示一个3*3的矩阵。
相关文章推荐
- 百度DMLC分布式深度机器学习开源项目(简称“深盟”)上线了如xgboost(速度快效果好的Boosting模型)、CXXNET(极致的C++深度学习库)、Minerva(高效灵活的并行深度学习引擎)以及Parameter Server(一小时训练600T数据)等产品,在语音识别、OCR识别、人脸识别以及计算效率提升上发布了多个成熟产品。
- 学习C++动态链接库基础 4000 知识 (主要关于QT项目)
- 【基于WPF+OneNote+Oracle的中文图片识别系统阶段总结】之篇一:WPF常用知识以及本项目设计总结
- 【基于WPF+OneNote+Oracle的中文图片识别系统阶段总结】之篇一:WPF常用知识以及本项目设计总结
- Android-图像识别项目OpenCV(3):程序目标以及单独发布
- Android-图像识别项目OpenCV(4):开发思路以及问题
- Android-图像识别项目OpenCV(4):开发思路以及问题
- 学习C++动态链接库基础知识 (主要关于QT项目)PART2
- Android-图像识别项目OpenCV(3):程序目标以及单独发布
- 要看懂OpenCV的代码,所需要的C和C++的基础知识
- Python编程-基础知识-python项目包和文件的管理以及如何引用相对路径的包和模块
- C++基础学习教程(六)----类编写的前情回顾以及项目实战(1)
- Android-图像识别项目OpenCV(1):技术选型以及NDK搭建
- 基于动物标签识别的基础知识以及FDX-B协议与结构介绍。
- Android-图像识别项目OpenCV(3):程序目标以及单独发布
- 条形码识别(1)——基础知识
- C++基础学习教程(六)----类编写的前情回想以及项目实战(1)
- Android-图像识别项目OpenCV(4):开发思路以及问题
- tornado简单项目简介以及基础知识(包括错误类型解释十)
- Android-图像识别项目OpenCV(1):技术选型以及NDK搭建