垃圾分類的正確姿勢(shì)?用 OpenCV 人工智能圖像識(shí)別技術(shù)來進(jìn)行
點(diǎn)擊藍(lán)色“Python交流圈”關(guān)注我丫
加個(gè)“星標(biāo)”,每天一起進(jìn)步一點(diǎn)點(diǎn)

OpenCV是一款非常強(qiáng)大的圖像處理工具,對(duì)于從事圖像處理領(lǐng)域相關(guān)工作的人來說這個(gè)可以說是必不可少的一項(xiàng)工具,用起來也很方面,下嗎是一段簡(jiǎn)單的介紹:
OpenCV是一個(gè)基于BSD許可(開源)發(fā)行的跨平臺(tái)計(jì)算機(jī)視覺和機(jī)器學(xué)習(xí)軟件庫(kù),可以運(yùn)行在Linux、Windows、Android和Mac OS操作系統(tǒng)上。它輕量級(jí)而且高效——由一系列 C 函數(shù)和少量 C++ 類構(gòu)成,同時(shí)提供了Python、Ruby、MATLAB等語言的接口,實(shí)現(xiàn)了圖像處理和計(jì)算機(jī)視覺方面的很多通用算法。OpenCV用C++語言編寫,它具有C ++,Python,Java和MATLAB接口,并支持Windows,Linux,Android和Mac OS,OpenCV主要傾向于實(shí)時(shí)視覺應(yīng)用,并在可用時(shí)利用MMX和SSE指令, 如今也提供對(duì)于C#、Ch、Ruby,GO的支持。
https://opencv.org/,首頁(yè)截圖如下所示:
https://docs.opencv.org/master/d9/df8/tutorial_root.html
?
https://docs.opencv.org/
?
https://www.zhihu.com/question/26881367


RGB顏色空間:
R:Red?紅色
G:Green?綠色
B:Blue?藍(lán)色
?
HSV顏色空間:
H:Hue?色度
S:Saturation?飽和度
V:Value?亮度
?
HSI顏色空間:
H:Hue?色度
S:Saturation?飽和度
I:Intensity?強(qiáng)度
#!usr/bin/env?python
#?encoding:utf-8
from?__future__?import?division
?
'''
功能:HSV空間圖片色素范圍查看器
'''
?
?
import?cv2
import?numpy?as?np
?
?
?
?
def?nothing(x):
????pass
?
?
def?colorLooker(pic='1.png'):
????'''
????HSV空間圖片色素范圍查看器
????'''
????#圖像加載
????image?=?cv2.imread(pic)
????#窗口初始化
????cv2.namedWindow('image',cv2.WINDOW_NORMAL)
????#創(chuàng)建拖動(dòng)條
????#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)
????#設(shè)置默認(rèn)最大值
????cv2.setTrackbarPos('HMax',?'image',?179)
????cv2.setTrackbarPos('SMax',?'image',?255)
????cv2.setTrackbarPos('VMax',?'image',?255)
????#初始化設(shè)置
????hMin?=?sMin?=?vMin?=?hMax?=?sMax?=?vMax?=?0
????phMin?=?psMin?=?pvMin?=?phMax?=?psMax?=?pvMax?=?0
????while(1):
????????#實(shí)時(shí)獲取拖動(dòng)條上的值
????????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')
????????#設(shè)定HSV的最大和最小值
????????lower?=?np.array([hMin,?sMin,?vMin])
????????upper?=?np.array([hMax,?sMax,?vMax])
????????#BGR和HSV顏色空間轉(zhuǎn)化處理
????????hsv?=?cv2.cvtColor(image,?cv2.COLOR_BGR2HSV)
????????mask?=?cv2.inRange(hsv,?lower,?upper)
????????result?=?cv2.bitwise_and(image,?image,?mask=mask)
????????#拖動(dòng)改變閾值的同時(shí),實(shí)時(shí)輸出調(diào)整的信息
????????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
????????#展示由色素帶閾值范圍處理過的結(jié)果圖片
????????cv2.imshow('image',?result)
????????if?cv2.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)
#設(shè)置閾值數(shù)據(jù)
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)
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中查找輪廓時(shí),物體應(yīng)該是白色而背景應(yīng)該是黑色
contours,?hierarchy?=?cv2.findContours(image,mode,method)
image:輸入圖像
mode:輪廓的模式。cv2.RETR_EXTERNAL只檢測(cè)外輪廓;cv2.RETR_LIST檢測(cè)的輪廓不建立等級(jí)關(guān)系;cv2.RETR_CCOMP建立兩個(gè)等級(jí)的輪廓,上一層為外邊界,內(nèi)層為內(nèi)孔的邊界。如果內(nèi)孔內(nèi)還有連通物體,則這個(gè)物體的邊界也在頂層;cv2.RETR_TREE建立一個(gè)等級(jí)樹結(jié)構(gòu)的輪廓。
method:輪廓的近似方法。cv2.CHAIN_APPROX_NOME存儲(chǔ)所有的輪廓點(diǎn),相鄰的兩個(gè)點(diǎn)的像素位置差不超過1;cv2.CHAIN_APPROX_SIMPLE壓縮水平方向、垂直方向、對(duì)角線方向的元素,只保留該方向的終點(diǎn)坐標(biāo),例如一個(gè)矩形輪廓只需要4個(gè)點(diǎn)來保存輪廓信息;cv2.CHAIN_APPROX_TC89_L1,cv2.CV_CHAIN_APPROX_TC89_KCOS
contours:返回的輪廓
hierarchy:每條輪廓對(duì)應(yīng)的屬性
'''
contours,hierarchy=cv2.findContours(output,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
print('contours_num:?',?len(contours))
count_dict={}
areas,lengths=0,0
for?i?in?range(len(contours)):
????one=contours[i]
????one_lk=one.tolist()
????if?len(one_lk)>=2:
????????area=cv2.contourArea(one)
????????length=cv2.arcLength(one,?True)
????????areas+=area
????????lengths+=length
????????left_list,right_list=[O[0][0]?for?O?in?one_lk],[O[0][1]?for?O?in?one_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=lambda?e:e[1][0],?reverse=True)
print(sorted_list[:10])
result['value']=count_dict
cv2.drawContours(img,contours,-1,(0,0,255),3)

if?sorted_list:
????filter_list=filterBox(sorted_list[:5])
????for?one_box?in?filter_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]])

作者:沂水寒城,CSDN博客專家,個(gè)人研究方向:機(jī)器學(xué)習(xí)、深度學(xué)習(xí)、NLP、CV
Blog: http://yishuihancheng.blog.csdn.net
--End--
近期熱門推薦? 1、Python 游戲編程之實(shí)現(xiàn)飛機(jī)大戰(zhàn)(含源代碼)
2、用 Hypothesis 快速測(cè)試你的 Python 代碼
3、別這樣直接運(yùn)行Python命令,否則電腦等于“裸奔”
6、厲害了!手?jǐn)]一個(gè)微信訂閱號(hào)鑒黃機(jī)器人!用起來很可以!
7、大廠的 404 頁(yè)面都長(zhǎng)啥樣?看到最后一個(gè),我笑了。。。
關(guān)注公眾號(hào),回復(fù)“001” 領(lǐng)取Python入門+進(jìn)階+實(shí)戰(zhàn)開發(fā)92天全套視頻教程
點(diǎn)贊最大的支持?



