10個(gè)步驟Opencv輕松檢測出圖片中條形碼
本文為大家分享了Opencv輕松檢測出圖片中條形碼的步驟,供大家參考,具體內(nèi)容如下
1. 原圖像大小調(diào)整,提高運(yùn)算效率
2. 轉(zhuǎn)化為灰度圖
3. 高斯平滑濾波
4.求得水平和垂直方向灰度圖像的梯度差,使用Sobel算子
5.均值濾波,消除高頻噪聲
6.二值化
7.閉運(yùn)算,填充條形碼間隙
8. 腐蝕,去除孤立的點(diǎn)
9. 膨脹,填充條形碼間空隙,根據(jù)核的大小,有可能需要2~3次膨脹操作
10.通過findContours找到條形碼區(qū)域的矩形邊界
實(shí)現(xiàn):
#include "core/core.hpp" #include "highgui/highgui.hpp" #include "imgproc/imgproc.hpp" using namespace cv; int main(int argc,char *argv[]) { Mat image,imageGray,imageGuussian; Mat imageSobelX,imageSobelY,imageSobelOut; image=imread(argv[1]); //1. 原圖像大小調(diào)整,提高運(yùn)算效率 resize(image,image,Size(500,300)); imshow("1.原圖像",image); //2. 轉(zhuǎn)化為灰度圖 cvtColor(image,imageGray,CV_RGB2GRAY); imshow("2.灰度圖",imageGray); //3. 高斯平滑濾波 GaussianBlur(imageGray,imageGuussian,Size(3,3),0); imshow("3.高斯平衡濾波",imageGuussian); //4.求得水平和垂直方向灰度圖像的梯度差,使用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("4.X方向梯度",imageSobelX); imshow("4.Y方向梯度",imageSobelY); imshow("4.XY方向梯度差",imageSobelOut); //5.均值濾波,消除高頻噪聲 blur(imageSobelOut,imageSobelOut,Size(3,3)); imshow("5.均值濾波",imageSobelOut); //6.二值化 Mat imageSobleOutThreshold; threshold(imageSobelOut,imageSobleOutThreshold,180,255,CV_THRESH_BINARY); imshow("6.二值化",imageSobleOutThreshold); //7.閉運(yùn)算,填充條形碼間隙 Mat element=getStructuringElement(0,Size(7,7)); morphologyEx(imageSobleOutThreshold,imageSobleOutThreshold,MORPH_CLOSE,element); imshow("7.閉運(yùn)算",imageSobleOutThreshold); //8. 腐蝕,去除孤立的點(diǎn) erode(imageSobleOutThreshold,imageSobleOutThreshold,element); imshow("8.腐蝕",imageSobleOutThreshold); //9. 膨脹,填充條形碼間空隙,根據(jù)核的大小,有可能需要2~3次膨脹操作 dilate(imageSobleOutThreshold,imageSobleOutThreshold,element); dilate(imageSobleOutThreshold,imageSobleOutThreshold,element); dilate(imageSobleOutThreshold,imageSobleOutThreshold,element); imshow("9.膨脹",imageSobleOutThreshold); vector<vector<Point>> contours; vector<Vec4i> hiera; //10.通過findContours找到條形碼區(qū)域的矩形邊界 findContours(imageSobleOutThreshold,contours,hiera,CV_RETR_EXTERNAL,CV_CHAIN_APPROX_NONE); for(int i=0;i<contours.size();i++) { Rect rect=boundingRect((Mat)contours[i]); rectangle(image,rect,Scalar(255),2); } imshow("10.找出二維碼矩形區(qū)域",image); waitKey(); }
使用另一幅圖片的效果如下:
底部的二維碼左側(cè)邊界定位錯(cuò)位,檢測發(fā)現(xiàn)在二值化的時(shí)候左側(cè)第二個(gè)條碼部分被歸零了,導(dǎo)致在之后的腐蝕操作中被腐蝕掉了。調(diào)整閾值分界值180到160,重新運(yùn)行正確:
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持我們。
上一篇:opencv實(shí)現(xiàn)讀取視頻保存視頻
欄 目:C語言
下一篇:C語言數(shù)據(jù)結(jié)構(gòu)之堆排序源代碼
本文標(biāo)題:10個(gè)步驟Opencv輕松檢測出圖片中條形碼
本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/919.html
您可能感興趣的文章
- 01-10C語言socket編程開發(fā)應(yīng)用示例
- 01-10solaris操作系統(tǒng)做c應(yīng)用程序開發(fā)步驟
- 01-10linux使用gcc編譯c語言共享庫步驟
- 01-10c語言網(wǎng)絡(luò)編程-標(biāo)準(zhǔn)步驟(改進(jìn)版)
- 01-10c語言網(wǎng)絡(luò)編程-標(biāo)準(zhǔn)步驟(比較簡單)
- 01-10c語言快速排序算法示例代碼分享
- 01-10實(shí)現(xiàn)opencv圖像裁剪分屏顯示示例
- 01-10使用opencv拉伸圖像擴(kuò)大分辨率示例
- 01-10C++與C#互調(diào)dll的實(shí)現(xiàn)步驟
- 01-10提高C++程序運(yùn)行效率的10個(gè)簡單方法


閱讀排行
本欄相關(guān)
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言的正則匹配函數(shù) c語言正則表達(dá)
- 04-02c語言用函數(shù)寫分段 用c語言表示分段
- 04-02c語言中對(duì)數(shù)函數(shù)的表達(dá)式 c語言中對(duì)
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數(shù) c語言中怎
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求
隨機(jī)閱讀
- 01-10delphi制作wav文件的方法
- 01-10C#中split用法實(shí)例總結(jié)
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 04-02jquery與jsp,用jquery
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 01-11ajax實(shí)現(xiàn)頁面的局部加載
- 01-10使用C語言求解撲克牌的順子及n個(gè)骰子
- 08-05織夢dedecms什么時(shí)候用欄目交叉功能?