国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

基于OpenCV來實現對圖像中目標對象檢測識別 以土地為例

新機器視覺 ? 來源:http://yishuihancheng.blog.csd ? 作者:沂水寒城 ? 2020-11-23 16:33 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

OpenCV是一款非常強大的圖像處理工具,對于從事圖像處理領域相關工作的人來說這個可以說是必不可少的一項工具,用起來也很方面,下嗎是一段簡單的介紹:

OpenCV是一個基于BSD許可(開源)發行的跨平臺計算機視覺機器學習軟件庫,可以運行在Linux、Windows、Android和Mac OS操作系統上。它輕量級而且高效——由一系列 C 函數和少量 C++ 類構成,同時提供了Python、Ruby、MATLAB等語言的接口,實現了圖像處理和計算機視覺方面的很多通用算法。OpenCV用C++語言編寫,它具有C ++,Python,Java和MATLAB接口,并支持Windows,Linux,Android和Mac OS,OpenCV主要傾向于實時視覺應用,并在可用時利用MMX和SSE指令, 如今也提供對于C#、Ch、Ruby,GO的支持。

OpenCV官網是https://opencv.org/,首頁截圖如下所示:

下面給出來幾個學習OpenCV的鏈接:

https://docs.opencv.org/master/d9/df8/tutorial_root.html https://docs.opencv.org/ https://www.zhihu.com/question/26881367我們今天的內容主要是想基于OpenCV來實現對圖像中我們關注的一些目標對象進行檢測識別或者說是對其存在的區域位置進行挖掘,在開始這篇文章之前,我曾經看到了有人基于OpenCV實現了火焰或者是煙霧的檢測,其實不管是類似的物體的檢測也好不相關的物體識別檢測也好,很大程度是比較通用的做法都是基于像素來完成最終的計算的。 這里我們以生活中最為常見的土地來作為要識別檢測的目標對象進行實驗,先來看一張網上找到的圖片,如下所示:

接下來先看一下,最終的識別檢測效果:

從上面的結果來看,比較完全地檢測到了圖中出現的土地的區域,最終,我們采用外切矩形的方式完成了對其輪廓數據的確定。 接下來,我們進入正文,在實際去實踐之前,我們很有必要來了解一下幾種比較常用的顏色空間,簡單總結匯總如下:

RGB顏色空間: R:Red紅色 G:Green綠色 B:Blue藍色 HSV顏色空間: H:Hue色度 S:Saturation飽和度 V:Value亮度 HSI顏色空間: H:Hue色度 S:Saturation飽和度 I:Intensity強度本質上來講,不同的物體不同的對象自身的像素范圍是不同的,在實際操作的時候基于像素區間可以過濾得到你所關注的對象,通常這樣的操作會在HSV空間中進行,個人的理解是將原始的BGR或者是RGB的圖像轉化到HSV空間里面來確定目標對象的像素區間更為容易,我實際測試過,在RGB和BGR空間里面也是可以進行計算的,只不過不如HSV空間,這里就不再多討論了,可以嘗試別的方式,本文用的是HSV空間進行計算的。 最開始的時候去確定目標對象所處的像素空間是很笨拙的,主要是借助OpenCV和matplotlib實現的“人眼探索”,比較麻煩,后來在github社區里面找到了一個界面的實現,覺得很不錯,就拿來用了,這里貼出來源碼實現,如下所示:#!usr/bin/envpython #encoding:utf-8 from__future__importdivision ''' 功能:HSV空間圖片色素范圍查看器 ''' importcv2 importnumpyasnp defnothing(x): pass defcolorLooker(pic='1.png'): ''' HSV空間圖片色素范圍查看器 ''' #圖像加載 image=cv2.imread(pic) #窗口初始化 cv2.namedWindow('image',cv2.WINDOW_NORMAL) #創建拖動條 #Opencv中Hue取值范圍是0-179 cv2.createTrackbar('HMin','image',0,179,nothing) cv2.createTrackbar('SMin','image',0,255,nothing) cv2.createTrackbar('VMin','image',0,255,nothing) cv2.createTrackbar('HMax','image',0,179,nothing) cv2.createTrackbar('SMax','image',0,255,nothing) cv2.createTrackbar('VMax','image',0,255,nothing) #設置默認最大值 cv2.setTrackbarPos('HMax','image',179) cv2.setTrackbarPos('SMax','image',255) cv2.setTrackbarPos('VMax','image',255) #初始化設置 hMin=sMin=vMin=hMax=sMax=vMax=0 phMin=psMin=pvMin=phMax=psMax=pvMax=0 while(1): #實時獲取拖動條上的值 hMin=cv2.getTrackbarPos('HMin','image') sMin=cv2.getTrackbarPos('SMin','image') vMin=cv2.getTrackbarPos('VMin','image') hMax=cv2.getTrackbarPos('HMax','image') sMax=cv2.getTrackbarPos('SMax','image') vMax=cv2.getTrackbarPos('VMax','image') #設定HSV的最大和最小值 lower=np.array([hMin,sMin,vMin]) upper=np.array([hMax,sMax,vMax]) #BGR和HSV顏色空間轉化處理 hsv=cv2.cvtColor(image,cv2.COLOR_BGR2HSV) mask=cv2.inRange(hsv,lower,upper) result=cv2.bitwise_and(image,image,mask=mask) #拖動改變閾值的同時,實時輸出調整的信息 if((phMin!=hMin)|(psMin!=sMin)|(pvMin!=vMin)|(phMax!=hMax)|(psMax!=sMax)|(pvMax!=vMax)): print("(hMin=%d,sMin=%d,vMin=%d),(hMax=%d,sMax=%d,vMax=%d)"%(hMin,sMin,vMin,hMax,sMax,vMax)) phMin=hMin psMin=sMin pvMin=vMin phMax=hMax psMax=sMax pvMax=vMax #展示由色素帶閾值范圍處理過的結果圖片 cv2.imshow('image',result) ifcv2.waitKey(10)&0xFF==ord('q'): break cv2.destroyAllWindows() if__name__=='__main__': colorLooker(pic='1.png') 啟動后截圖如下所示:

借助界面中的拖動條可以很方便地進行調節,看到實時處理后的結果圖片:

經過調節后最終的結果如下所示:

調整拖動條的同時,終端窗口輸出如下所示:

到這里,我們已經獲取到了所需要的各個維度的閾值數據了,就可以進行后面的處理了。 接下來我們基于上述閾值來進行區域挖掘計算,同樣使用上述的圖片,核心代碼實現如下所示:

img=Image.open('1.png') img=cv2.cvtColor(np.asarray(img),cv2.COLOR_RGB2BGR) frame=cv2.cvtColor(img,cv2.COLOR_BGR2HSV) blur=cv2.GaussianBlur(frame,(21,21),0) hsv=cv2.cvtColor(blur,cv2.COLOR_BGR2HSV) h,w,way=img.shape total=h*w print('h:',h,'w:',w,'area:',total) #設置閾值數據 lower=[8,67,84] upper=[85,255,255] lower=np.array(lower,dtype="uint8") upper=np.array(upper,dtype="uint8") mask=cv2.inRange(hsv,lower,upper) output=cv2.bitwise_and(hsv,hsv,mask=mask) count=cv2.countNonZero(mask) print('count:',count) now_ratio=round(int(count)/total,3) print('now_ratio:',now_ratio)

之后為了得到實際的輪廓區域,我們可以使用cv2.findContours方法來實現目標對象的區域挖掘計算,核心代碼實現如下所示:gray=cv2.cvtColor(output,cv2.COLOR_BGR2GRAY) print('gray_shape:',gray.shape) ret,output=cv2.threshold(gray,127,255,cv2.THRESH_BINARY) ''' cv2.findContours:
在opencv中查找輪廓時,物體應該是白色而背景應該是黑色 contours,hierarchy=cv2.findContours(image,mode,method) image:輸入圖像 mode:輪廓的模式。cv2.RETR_EXTERNAL只檢測外輪廓;cv2.RETR_LIST檢測的輪廓不建立等級關系;cv2.RETR_CCOMP建立兩個等級的輪廓,上一層為外邊界,內層為內孔的邊界。如果內孔內還有連通物體,則這個物體的邊界也在頂層;cv2.RETR_TREE建立一個等級樹結構的輪廓。 method:輪廓的近似方法。cv2.CHAIN_APPROX_NOME存儲所有的輪廓點,相鄰的兩個點的像素位置差不超過1;cv2.CHAIN_APPROX_SIMPLE壓縮水平方向、垂直方向、對角線方向的元素,只保留該方向的終點坐標,例如一個矩形輪廓只需要4個點來保存輪廓信息;cv2.CHAIN_APPROX_TC89_L1,cv2.CV_CHAIN_APPROX_TC89_KCOS contours:返回的輪廓 hierarchy:每條輪廓對應的屬性 ''' contours,hierarchy=cv2.findContours(output,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE) print('contours_num:',len(contours)) count_dict={} areas,lengths=0,0 foriinrange(len(contours)): one=contours[i] one_lk=one.tolist() iflen(one_lk)>=2: area=cv2.contourArea(one) length=cv2.arcLength(one,True) areas+=area lengths+=length left_list,right_list=[O[0][0]forOinone_lk],[O[0][1]forOinone_lk] minX,maxX,minY,maxY=min(left_list),max(left_list),min(right_list),max(right_list) A=abs(maxY-minY)*abs(maxX-minX) print('area:',area,'A:',A,'length:',length) count_dict[i]=[A,area,length,[minX,maxX,minY,maxY]] sorted_list=sorted(count_dict.items(),key=lambdae:e[1][0],reverse=True) print(sorted_list[:10]) result['value']=count_dict cv2.drawContours(img,contours,-1,(0,0,255),3)完成輪廓的挖掘計算后,我們借助于OpenCV實現可視化,結果如下所示:

可以看到:已經大體上實現了我們所要的功能,但是美中不足的是里面有很多小的矩形框,這個是我們外切矩形設計的問題,沒有考慮到過濾掉嵌套或者是包含的情況,所以這里就來處理一下:

ifsorted_list: filter_list=filterBox(sorted_list[:5]) forone_boxinfilter_list: print('one_box:',one_box) A,area,length,[minX,maxX,minY,maxY]=one_box cv2.rectangle(img,(minX,maxY),(maxX,minY),(0,255,0),3)此時的結果如下所示:

對應的計算結果輸出如下所示:

('h:',336L,'w:',500L,'area:',168000L) ('count:',126387) ('now_ratio:',0.752) ('output_shape:',(336L,500L,3L)) ('gray_shape:',(336L,500L)) ('contours_num:',64) ('area:',0.0,'A:',2,'length:',4.828427076339722) ('area:',0.0,'A:',0,'length:',4.0) ('area:',29.0,'A:',44,'length:',27.313708186149597) ('area:',42.5,'A:',72,'length:',34.72792184352875) ('area:',0.5,'A:',6,'length:',9.071067690849304) ('area:',0.0,'A:',10,'length:',11.656854152679443) ('area:',0.0,'A:',1,'length:',2.8284270763397217) ('area:',0.0,'A:',2,'length:',4.828427076339722) ('area:',1.5,'A:',2,'length:',5.414213538169861) ('area:',16.5,'A:',36,'length:',27.55634891986847) ('area:',5.0,'A:',36,'length:',37.79898953437805) ('area:',1.5,'A:',3,'length:',8.242640614509583) ('area:',0.0,'A:',0,'length:',2.0) ('area:',2.0,'A:',2,'length:',6.0) ('area:',360.0,'A:',1026,'length:',206.93607211112976) ('area:',44.0,'A:',143,'length:',59.94112479686737) ('area:',0.0,'A:',1,'length:',2.8284270763397217) ('area:',0.0,'A:',1,'length:',2.8284270763397217) ('area:',33.5,'A:',60,'length:',30.38477599620819) ('area:',76.5,'A:',228,'length:',63.35533845424652) ('area:',320.0,'A:',792,'length:',166.9949471950531) ('area:',16.0,'A:',35,'length:',21.313708305358887) ('area:',0.0,'A:',8,'length:',10.828427076339722) ('area:',21.0,'A:',78,'length:',37.79898953437805) ('area:',0.0,'A:',1,'length:',2.8284270763397217) ('area:',0.0,'A:',2,'length:',4.828427076339722) ('area:',0.0,'A:',2,'length:',4.828427076339722) ('area:',3.5,'A:',25,'length:',20.727921843528748) ('area:',1.5,'A:',12,'length:',13.071067690849304) ('area:',51.0,'A:',121,'length:',53.94112491607666) ('area:',0.0,'A:',1,'length:',2.8284270763397217) ('area:',32.5,'A:',50,'length:',27.899494767189026) ('area:',309.5,'A:',722,'length:',96.32590079307556) ('area:',34.0,'A:',42,'length:',22.485281229019165) ('area:',80970.5,'A:',132699,'length:',2718.5739262104034) [(63,[132699,80970.5,2718.5739262104034,[1,498,67,334]]),(24,[1026,360.0,206.93607211112976,[33,60,281,319]]),(39,[792,320.0,166.9949471950531,[61,94,252,276]]),(61,[722,309.5,96.32590079307556,[384,422,75,94]]),(34,[228,76.5,63.35533845424652,[1,13,267,286]]),(25,[143,44.0,59.94112479686737,[68,81,280,291]]),(55,[121,51.0,53.94112491607666,[189,200,219,230]]),(47,[78,21.0,37.79898953437805,[100,113,235,241]]),(4,[72,42.5,34.72792184352875,[209,221,328,334]]),(32,[60,33.5,30.38477599620819,[15,25,274,280]])] ('one_box:',[132699,80970.5,2718.5739262104034,[1,498,67,334]])為了更加直觀地對比分析,我們將上面計算各個步驟中的對象數據進行可視化,借助于matplotlib繪制在同一張圖上,結果如下所示:

左上角為原始圖片,右下角為最終處理得到的圖片,可以看到整個處理過程的變化。 到這里本文的內容就結束了,學習依舊在路上,歡迎交流,互相學習!

作者:沂水寒城,CSDN博客專家,個人研究方向:機器學習、深度學習、NLP、CV

Blog:http://yishuihancheng.blog.csdn.net

責任編輯:PSY

原文標題:垃圾分類的正確姿勢?用 OpenCV 人工智能圖像識別技術來進行

文章出處:【微信公眾號:新機器視覺】歡迎添加關注!文章轉載請注明出處。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 圖像識別
    +關注

    關注

    9

    文章

    533

    瀏覽量

    40057
  • 檢測識別
    +關注

    關注

    0

    文章

    9

    瀏覽量

    7363
  • OpenCV
    +關注

    關注

    33

    文章

    652

    瀏覽量

    44799

原文標題:垃圾分類的正確姿勢?用 OpenCV 人工智能圖像識別技術來進行

文章出處:【微信號:vision263com,微信公眾號:新機器視覺】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    技術分享 | RK3588基于Yolov5的目標識別演示

    YOLO是一種基于深度神經網絡的目標檢測算法,用在圖像或視頻實時識別和定位多個對象。在其各個版
    的頭像 發表于 09-18 17:27 ?1294次閱讀
    技術分享 | RK3588基于Yolov5的<b class='flag-5'>目標識別</b>演示

    如何使用樹莓派與OpenCV實現面部和運動追蹤的云臺系統?

    使用樹莓派和OpenCV實時掃描并存儲二維碼使用樹莓派和OpenCV實現物體與動物識別使用樹莓派、攝像頭和OpenCV進行速度
    的頭像 發表于 08-14 17:45 ?1581次閱讀
    如何使用樹莓派與<b class='flag-5'>OpenCV</b><b class='flag-5'>實現</b>面部和運動追蹤的云臺系統?

    如何使用樹莓派+OpenCV實現姿態估計和面部特征點追蹤?

    使用樹莓派和OpenCV實時掃描并存儲二維碼使用樹莓派和OpenCV實現物體與動物識別使用樹莓派、攝像頭和OpenCV進行速度
    的頭像 發表于 08-13 17:44 ?1311次閱讀
    如何使用樹莓派+<b class='flag-5'>OpenCV</b><b class='flag-5'>實現</b>姿態估計和面部特征點追蹤?

    【Milk-V Duo S 開發板免費體驗】SDK編譯、人臉檢測OpenCV測試

    -mobile-test ./opencv-mobile-test 生成 200x200 尺寸的 out.jpg 圖像,即實現圖片壓縮。 該測試工程可結合物體識別模型,
    發表于 07-11 13:48

    基于LockAI視覺識別模塊:C++人臉識別

    基本知識講解 1.1 人臉識別簡介 人臉識別是一種利用人的臉部特征進行身份識別的生物識別技術。它通過檢測
    發表于 07-01 12:01

    基于LockAI視覺識別模塊:手寫數字識別

    (input_mat); 作用:PaddleClas類的一個函數,用于實現手寫數字識別。 參數說明: input_mat:要識別圖像
    發表于 06-30 16:45

    基于LockAI視覺識別模塊:C++目標檢測

    檢測是計算機視覺領域中的一個關鍵任務,它不僅需要識別圖像存在哪些對象,還需要定位這些對象的位置
    發表于 06-06 14:43

    基于LockAI視覺識別模塊:C++條碼識別

    (input_mat); 作用:Code128Detector類的一個函數,用于實現條碼識別。 參數說明: input_mat: 要識別圖像
    發表于 05-27 10:26

    基于LockAI視覺識別模塊:C++二維碼識別

    實現二維碼識別。 參數說明: input_mat: 輸入參數,類型cv::Mat,表示要分析的輸入圖像。 返回值: 返回一個包含二維碼檢測
    發表于 05-26 09:57

    基于LockAI視覺識別模塊:C++輪廓檢測

    基本知識講解 1.1 圖像處理的重要性 目標檢測圖像處理技術可以用于檢測圖像
    發表于 05-22 10:05

    基于LockAI視覺識別模塊:C++圖像的基本運算

    圖像處理,理解圖像的基本操作是掌握計算機視覺技術的關鍵。本文章將介紹 基于LockAI視覺識別模塊下OpenCV
    發表于 05-06 16:56

    基于LockAI視覺識別模塊:C++圖像采集例程

    本文主要演示如何使用LockAI視覺識別模塊進行視頻流的讀取,同時使用Edit模塊進行圖像傳輸。基礎知識講解1.1OpenCV簡介OpenCV(OpenSourceComputerVi
    的頭像 發表于 04-30 18:23 ?755次閱讀
    基于LockAI視覺<b class='flag-5'>識別</b>模塊:C++<b class='flag-5'>圖像</b>采集例程

    基于LockAI視覺識別模塊:C++圖像采集例程

    OpenCV 實現攝像頭模塊的視頻流讀取與圖像傳輸。核心步驟包括: 初始化攝像頭并設置分辨率; 打開攝像頭并逐幀捕獲圖像; 使用 Edit 模塊進行
    發表于 04-30 10:52

    LSDK構建opencv時遇到的問題求解

    我正在嘗試使用 flex-builder 運行 bld -c opencv -r ubuntu:桌面 我想要最新版本的 OpenCV。在我的 sdk.yml 文件,我將
    發表于 03-26 08:26

    為什么無法使用圖像文件夾執行對象檢測Python演示?

    使用自定義固態盤 Mobilenet 執行對象檢測,并使用自定義腳本在文件夾包含多個圖像。 每張圖像上的
    發表于 03-07 07:51