这其实是一个小工程
完成的功能:
-
使用摄像头采集图像进行预处理(检测部分)
-
提取出预处理的条形码图像(识别部分)
-
将条形码进行存入数据库(存储部分)
首先接到这个图像识别的小工程需要先确定这个工程的最初输入,和最后输出,输入就是普通的RGB图像,输出是数据库文件。
其中需要完成的过程,就是我需要做得功能,检测部分、识别部分和存储部分,话不多说,上部分代码:
//检测部分 需要用到opencv开源计算机视觉库
//输入是RGB 输出是保存的检测部分
Mat Check(Mat image)
{
vector<vector<Point>> contours;
vector<Vec4i> hiera;
imshow("原图", image);
//原图像大小调整,提高运算效率
//resize(image, image, Size(500, 300));
//imshow("原图像", image); waitKey(15); system("pause");
//转化为灰度图
cvtColor(image, imageGray, CV_RGB2GRAY);
//imshow("灰度图", imageGray); waitKey(15); system("pause");
//高斯平滑滤波
GaussianBlur(imageGray, imageGuussian, Size(3, 3), 0);
//imshow("高斯平衡滤波", imageGuussian); waitKey(15); system("pause");
//求得水平和垂直方向灰度图像的梯度差,使用Sobel算子
Mat imageX16S, imageY16S;
Sobel(imageGuussian, imageX16S, CV_16S, 1, 0, 3, 1, 0, 4);
Sobel(imageGuussian, imageY16S, CV_16S, 0, 1, 3, 1, 0, 4);
convertScaleAbs(imageX16S, imageSobelX, 1, 0);
convertScaleAbs(imageY16S, imageSobelY, 1, 0);
imageSobelOut = imageSobelX - imageSobelY;
//imshow("X方向梯度", imageSobelX); waitKey(15); system("pause");
//imshow("Y方向梯度", imageSobelY); waitKey(15); system("pause");
//imshow("XY方向梯度差", imageSobelOut); waitKey(15); system("pause");
//均值滤波,消除高频噪声
blur(imageSobelOut, imageSobelOut, Size(3, 3));
//imshow("均值滤波", imageSobelOut); waitKey(15); system("pause");
//二值化
Mat imageSobleOutThreshold;
threshold(imageSobelOut, imageSobleOutThreshold, 100, 255, CV_THRESH_BINARY);
//imshow("二值化", imageSobleOutThreshold); waitKey(15);