91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何使用Python-OpenCV實(shí)現(xiàn)餐盤水果識(shí)別與計(jì)價(jià)的應(yīng)用

新機(jī)器視覺(jué) ? 來(lái)源:OpenCV與AI深度學(xué)習(xí) ? 作者: Color Space ? 2021-07-06 11:02 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

導(dǎo)讀本文主要介紹使用Python-OpenCV實(shí)現(xiàn)餐盤水果識(shí)別與計(jì)價(jià)的應(yīng)用。

測(cè)試圖像與說(shuō)明

使用圖像,拍攝環(huán)境有待改善(存在光照不均和拍攝角度的影響):

餐盤/菜品識(shí)別一般方法:

(1)識(shí)別餐盤---傳統(tǒng)方法和機(jī)器學(xué)習(xí)/深度學(xué)習(xí)方法;

(2)識(shí)別菜品---機(jī)器學(xué)習(xí)/深度學(xué)習(xí)方法;

本文使用傳統(tǒng)方法識(shí)別餐盤。

效果演示:

算法思路與實(shí)現(xiàn)步驟

思路:傳統(tǒng)方法識(shí)別餐盤---依據(jù)顏色和形狀來(lái)區(qū)分。

具體步驟:

(1)餐盤顏色共三種:白色、綠色、橙色,形狀共兩種:圓形和方形。區(qū)別顏色使用HSV閾值范圍篩選即可,圓形與方形通過(guò)輪廓面積與輪廓最小外接圓面積的比值來(lái)篩選,圓形rate》=0.9,方形《0.9;

(2)水果共三種:蘋果、香蕉、橙子,通過(guò)顏色可以區(qū)分蘋果和橙子,通過(guò)輪廓最小外接矩形的寬高比可以區(qū)分香蕉和橙子;

(3)計(jì)價(jià):盤子和水果的數(shù)量乘以對(duì)應(yīng)的單價(jià)即可;

(4)設(shè)計(jì)UI,計(jì)價(jià)時(shí)顯示收款碼。

Python-OpenCV實(shí)現(xiàn)算法核心代碼與效果如下:

def Recognize_Dish(self,img): #-------------------香蕉檢測(cè)-----------------# banana_num = 0 hsv_img=cv2.cvtColor(img,cv2.COLOR_BGR2HSV) lower_yellow = np.array([15,30,145])#顏色范圍低閾值 upper_yellow = np.array([35,255,255])#顏色范圍高閾值 mask = cv2.inRange(hsv_img,lower_yellow,upper_yellow)#根據(jù)顏色范圍刪選 mask = cv2.medianBlur(mask, 5)#中值濾波 #cv2.imshow(‘mask_banana’, mask) contours,hierarchy = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE) for cnt in contours: rect = cv2.minAreaRect(cnt) box = cv2.boxPoints(rect) box = np.int0(box) width = max(rect[1][0],rect[1][1]) height = min(rect[1][0],rect[1][1]) center = (int(rect[0][0]),int(rect[0][1])) if width 》 180 and height 》 80 and height 《 130: #print(width,height) img = cv2.drawContours(img,[box],0,(0,0,255),2) cv2.putText(img,‘banana’,center,font,1,(255,0,255), 2) banana_num += 1 item_0 = QTableWidgetItem(“%d”%banana_num) self.tableWidget.setItem(8, 0, item_0)

#-------------------蘋果檢測(cè)-----------------# apple_num = 0 lower_apple = np.array([0,50,50])#顏色范圍低閾值 upper_apple = np.array([30,255,255])#顏色范圍高閾值 mask_apple = cv2.inRange(hsv_img,lower_apple,upper_apple)#根據(jù)顏色范圍刪選 mask_apple = cv2.medianBlur(mask_apple, 9)#中值濾波 #cv2.imshow(‘mask_apple’, mask_apple) #cv2.imwrite(‘mask_apple.jpg’, mask_apple) contours2,hierarchy2 = cv2.findContours(mask_apple, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE) for cnt2 in contours2: center,radius = cv2.minEnclosingCircle(cnt2) area = cv2.contourArea(cnt2) #print(radius) rate = area / (math.pi * radius *radius) if radius 》 50 and radius 《 75 and rate 《 0.91: #print(radius) cv2.circle(img,(int(center[0]),int(center[1])),int(radius),(0,255,0),2) cv2.putText(img,‘a(chǎn)pple’,(int(center[0]),int(center[1])),font,1,(255,0,0), 2) apple_num += 1 item_1 = QTableWidgetItem(“%d”%apple_num) self.tableWidget.setItem(6, 0, item_1)

#-------------------橘子檢測(cè)-----------------# orange_num = 0 lower_orange = np.array([0,90,60])#顏色范圍低閾值 upper_orange = np.array([60,255,255])#顏色范圍高閾值 mask_orange = cv2.inRange(hsv_img,lower_orange,upper_orange)#根據(jù)顏色范圍刪選 mask_orange = cv2.medianBlur(mask_orange, 5)#中值濾波 #cv2.imshow(‘mask_orange’, mask_orange) #cv2.imwrite(‘mask_orange.jpg’, mask_orange) contours3,hierarchy3 = cv2.findContours(mask_orange, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE) for cnt3 in contours3: center,radius = cv2.minEnclosingCircle(cnt3) area = cv2.contourArea(cnt3) #print(radius) rate = area / (math.pi * radius *radius) if radius 》 50 and radius 《 75 and rate 》 0.85: #print(radius) cv2.circle(img,(int(center[0]),int(center[1])),int(radius),(255,0,255),2) cv2.putText(img,‘orange’,(int(center[0]),int(center[1])),font,1,(255,255,0), 2) orange_num += 1 item_2 = QTableWidgetItem(“%d”%orange_num) self.tableWidget.setItem(7, 0, item_2)

#-------------------白色餐盤檢測(cè)-----------------# white_circle_num = 0 white_rect_num = 0 lower_white = np.array([0,0,150])#顏色范圍低閾值 upper_white= np.array([100,55,255])#顏色范圍高閾值 mask_white = cv2.inRange(hsv_img,lower_white,upper_white)#根據(jù)顏色范圍刪選 mask_white = cv2.medianBlur(mask_white, 5)#中值濾波 #cv2.imshow(‘mask_white’, mask_white) #cv2.imwrite(‘mask_white.jpg’, mask_white) contours4,hierarchy4 = cv2.findContours(mask_white, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE) for cnt4 in contours4: area = cv2.contourArea(cnt4) center,radius = cv2.minEnclosingCircle(cnt4) #print(radius) rate = area / (math.pi * radius *radius) if radius 》 100 and radius 《 160: #print(radius) if rate 》= 0.9: cv2.circle(img,(int(center[0]),int(center[1])),int(radius),(255,255,0),2) cv2.putText(img,‘white_circle’,(int(center[0]),int(center[1])),font,1,(0,255,0), 2) white_circle_num += 1 elif rate 》0.6 and rate 《 0.9: rect = cv2.minAreaRect(cnt4) box = cv2.boxPoints(rect) box = np.int0(box) #cv2.circle(img,(int(center[0]),int(center[1])),int(radius),(255,0,255),5) img = cv2.drawContours(img,[box],0,(255,255,0),2) cv2.putText(img,‘white_rect’,(int(center[0]),int(center[1])),font,1,(0,255,0), 2) white_rect_num += 1 item_3 = QTableWidgetItem(“%d”%white_circle_num) self.tableWidget.setItem(0, 0, item_3) item_4 = QTableWidgetItem(“%d”%white_rect_num) self.tableWidget.setItem(1, 0, item_4)

#-------------------綠色餐盤檢測(cè)-----------------# green_circle_num = 0 green_rect_num = 0 lower_green = np.array([30,65,65])#顏色范圍低閾值 upper_green= np.array([80,255,255])#顏色范圍高閾值 mask_green = cv2.inRange(hsv_img,lower_green,upper_green)#根據(jù)顏色范圍刪選 mask_green = cv2.medianBlur(mask_green, 5)#中值濾波 #cv2.imshow(‘mask_green’, mask_green) #cv2.imwrite(‘mask_green.jpg’, mask_green) contours5,hierarchy5 = cv2.findContours(mask_green, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE) for cnt5 in contours5: area = cv2.contourArea(cnt5) center,radius = cv2.minEnclosingCircle(cnt5) #print(radius) rate = area / (math.pi * radius *radius) if radius 》 100 and radius 《 160: #print(radius) if rate 》= 0.9: cv2.circle(img,(int(center[0]),int(center[1])),int(radius),(0,255,0),2) cv2.putText(img,‘green_circle’,(int(center[0]),int(center[1])),font,1,(0,255,255), 2) green_circle_num += 1 elif rate 》0.6 and rate 《 0.9: rect = cv2.minAreaRect(cnt5) box = cv2.boxPoints(rect) box = np.int0(box) #cv2.circle(img,(int(center[0]),int(center[1])),int(radius),(255,0,255),5) img = cv2.drawContours(img,[box],0,(0,255,0),2) cv2.putText(img,‘green_rect’,(int(center[0]),int(center[1])),font,1,(0,255,255), 2) green_rect_num += 1 item_5 = QTableWidgetItem(“%d”%green_circle_num) self.tableWidget.setItem(4, 0, item_5) item_6 = QTableWidgetItem(“%d”%green_rect_num) self.tableWidget.setItem(5, 0, item_6)

#-------------------橙色餐盤檢測(cè)-----------------# orange_circle_num = 0 orange_rect_num = 0 lower_orange_dish = np.array([0,100,100])#顏色范圍低閾值 upper_orange_dish= np.array([15,255,255])#顏色范圍高閾值 mask_orange_dish = cv2.inRange(hsv_img,lower_orange_dish,upper_orange_dish)#根據(jù)顏色范圍刪選 mask_orange_dish = cv2.medianBlur(mask_orange_dish, 5)#中值濾波 #cv2.imshow(‘mask_green’, mask_green) #cv2.imwrite(‘mask_orange_dish.jpg’, mask_orange_dish) contours6,hierarchy6 = cv2.findContours(mask_orange_dish, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE) for cnt6 in contours6: area = cv2.contourArea(cnt6) center,radius = cv2.minEnclosingCircle(cnt6) #print(‘----------------’) #print(radius) rate = area / (math.pi * radius *radius) if radius 》 100 and radius 《 160: #print(rate) if rate 》= 0.8: cv2.circle(img,(int(center[0]),int(center[1])),int(radius),(0,255,0),2) cv2.putText(img,‘orange_circle’,(int(center[0]),int(center[1])),font,1,(255,0,255), 2) orange_circle_num += 1 elif rate 》0.3 and rate 《 0.8: rect = cv2.minAreaRect(cnt6) box = cv2.boxPoints(rect) box = np.int0(box) #cv2.circle(img,(int(center[0]),int(center[1])),int(radius),(255,0,255),5) img = cv2.drawContours(img,[box],0,(0,255,0),2) cv2.putText(img,‘orange_rect’,(int(center[0]),int(center[1])),font,1,(255,0,255), 2) orange_rect_num += 1 item_7 = QTableWidgetItem(“%d”%orange_circle_num) self.tableWidget.setItem(2, 0, item_7) item_8 = QTableWidgetItem(“%d”%orange_rect_num) self.tableWidget.setItem(3, 0, item_8)

for i in range(0,9): self.tableWidget.item(i,0).setTextAlignment(QtCore.Qt.AlignHCenter|QtCore.Qt.AlignVCenter) self.tableWidget.item(i,1).setTextAlignment(QtCore.Qt.AlignHCenter|QtCore.Qt.AlignVCenter) #----------------計(jì)算價(jià)格--------------# self.price = self.price_white_circle * white_circle_num + self.price_white_rect * white_rect_num + self.price_orange_circle * orange_circle_num + self.price_orange_rect * orange_rect_num + self.price_green_circle * green_circle_num + self.price_green_rect * green_rect_num + self.price_apple * apple_num + self.price_orange * orange_num + self.price_banana * banana_num print(self.price) return img

結(jié)尾語(yǔ)

(1) 算法只針對(duì)水果和餐盤數(shù)量和形態(tài)較少的情形,方法供參考;

(2) 實(shí)際應(yīng)用將更復(fù)雜,要求更高,一般開(kāi)源的目標(biāo)檢測(cè)網(wǎng)絡(luò)也很難滿足要求;

(3) 常見(jiàn)菜品識(shí)別的實(shí)際應(yīng)用要求:一個(gè)菜只用一張圖片訓(xùn)練或做模板,訓(xùn)練和識(shí)別時(shí)間盡量短,能夠及時(shí)更新使用。所以真正類似的產(chǎn)品并不好做,如果你有好的方法歡迎留言。

—版權(quán)聲明—

來(lái)源: OpenCV與AI深度學(xué)習(xí)

僅用于學(xué)術(shù)分享,版權(quán)屬于原作者。

若有侵權(quán),請(qǐng)聯(lián)系刪除或修改!

編輯:jq

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4967

    瀏覽量

    73939
  • 機(jī)器學(xué)習(xí)

    關(guān)注

    66

    文章

    8553

    瀏覽量

    136916
  • OpenCV
    +關(guān)注

    關(guān)注

    33

    文章

    652

    瀏覽量

    44774
  • python
    +關(guān)注

    關(guān)注

    57

    文章

    4876

    瀏覽量

    90013
  • 深度學(xué)習(xí)
    +關(guān)注

    關(guān)注

    73

    文章

    5598

    瀏覽量

    124382

原文標(biāo)題:應(yīng)用實(shí)例 | 手把手教你用OpenCV實(shí)現(xiàn)餐盤水果識(shí)別計(jì)價(jià)程序(附代碼)

文章出處:【微信號(hào):vision263com,微信公眾號(hào):新機(jī)器視覺(jué)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    【上海晶珩睿莓 1 單板計(jì)算機(jī)】人臉識(shí)別

    【上海晶珩睿莓 1 單板計(jì)算機(jī)】人臉識(shí)別 本文介紹了上海晶珩睿莓 1 單板計(jì)算機(jī)結(jié)合 OpenCV 內(nèi)置 YuNet 算法和 SFace 模型實(shí)現(xiàn)人臉識(shí)別的項(xiàng)目設(shè)計(jì),包括環(huán)境部署、預(yù)訓(xùn)
    發(fā)表于 01-04 20:22

    【上海晶珩睿莓 1 開(kāi)發(fā)板試用體驗(yàn)】車牌識(shí)別

    、關(guān)鍵代碼以及板端推理等相關(guān)流程。 項(xiàng)目介紹 準(zhǔn)備工作:OpenCV 安裝、Ultralytics 軟件包安裝、預(yù)訓(xùn)練模型下載等; 車牌識(shí)別:采用 LPRNet 算法及 ONNX 模型實(shí)現(xiàn)車牌
    發(fā)表于 01-02 20:53

    沒(méi)有專利的opencv-python 版本

    所有 官方發(fā)布的 opencv-python 核心版本(無(wú) contrib 擴(kuò)展)都無(wú)專利風(fēng)險(xiǎn)——專利問(wèn)題僅存在于 opencv-contrib-python 擴(kuò)展模塊中的少數(shù)算法(如早期 SIFT
    發(fā)表于 12-13 12:37

    【EASY EAI Orin Nano開(kāi)發(fā)板試用體驗(yàn)】PP-OCRV5文字識(shí)別實(shí)例搭建與移植

    【EASY EAI Orin Nano開(kāi)發(fā)板試用體驗(yàn)】PP-OCRV5文字識(shí)別實(shí)例搭建與移植 PP-OCRV5是PP-OCR新一代文字識(shí)別解決方案, 該方案聚焦于多場(chǎng)景、多文字類型的文字識(shí)別。在
    發(fā)表于 08-18 16:57

    零成本鋼鐵俠手套!樹(shù)莓派+OpenCV 秒變手勢(shì)遙控器!

    大家好,這是一個(gè)樹(shù)莓派和OpenCV的連載專題。使用樹(shù)莓派與OpenCV實(shí)現(xiàn)姿態(tài)估計(jì)和面部特征點(diǎn)追蹤使用樹(shù)莓派與OpenCV實(shí)現(xiàn)面部和運(yùn)動(dòng)追
    的頭像 發(fā)表于 08-16 16:16 ?1259次閱讀
    零成本鋼鐵俠手套!樹(shù)莓派+<b class='flag-5'>OpenCV</b> 秒變手勢(shì)遙控器!

    如何使用樹(shù)莓派與OpenCV實(shí)現(xiàn)面部和運(yùn)動(dòng)追蹤的云臺(tái)系統(tǒng)?

    大家好,這是一個(gè)樹(shù)莓派和OpenCV的連載專題。使用樹(shù)莓派與OpenCV實(shí)現(xiàn)姿態(tài)估計(jì)和面部特征點(diǎn)追蹤使用樹(shù)莓派與OpenCV實(shí)現(xiàn)面部和運(yùn)動(dòng)追
    的頭像 發(fā)表于 08-14 17:45 ?1543次閱讀
    如何使用樹(shù)莓派與<b class='flag-5'>OpenCV</b><b class='flag-5'>實(shí)現(xiàn)</b>面部和運(yùn)動(dòng)追蹤的云臺(tái)系統(tǒng)?

    如何使用樹(shù)莓派+OpenCV實(shí)現(xiàn)姿態(tài)估計(jì)和面部特征點(diǎn)追蹤?

    大家好,這是一個(gè)樹(shù)莓派和OpenCV的連載專題。使用樹(shù)莓派與OpenCV實(shí)現(xiàn)姿態(tài)估計(jì)和面部特征點(diǎn)追蹤使用樹(shù)莓派與OpenCV實(shí)現(xiàn)面部和運(yùn)動(dòng)追
    的頭像 發(fā)表于 08-13 17:44 ?1299次閱讀
    如何使用樹(shù)莓派+<b class='flag-5'>OpenCV</b><b class='flag-5'>實(shí)現(xiàn)</b>姿態(tài)估計(jì)和面部特征點(diǎn)追蹤?

    【GM-3568JHF開(kāi)發(fā)板免費(fèi)體驗(yàn)】OpenCV開(kāi)發(fā)環(huán)境安裝和計(jì)數(shù)程序開(kāi)發(fā)

    、 Android 等系統(tǒng)上運(yùn)行,并通過(guò)Python接口簡(jiǎn)化操作。 sudo apt install libopencv-dev python3-opencv 四、OpenCV圖像識(shí)別
    發(fā)表于 08-09 13:30

    如何板端編譯OpenCV并搭建應(yīng)用--基于瑞芯微米爾RK3576開(kāi)發(fā)板

    INSTALL_PYTHON_EXAMPLES=OFF -D OPENCV_GENERATE_PKGCONFIG=ON -D OPENCV_EXTRA_MODULES_PATH=/home/myir/Downloads
    發(fā)表于 08-08 17:14

    用樹(shù)莓派 + OpenCV 打造人臉識(shí)別技術(shù)!

    在本指南中,我們將教您如何使用OpenCV和面部識(shí)別庫(kù)(兩個(gè)出色的開(kāi)源項(xiàng)目)設(shè)置樹(shù)莓派來(lái)檢測(cè)和識(shí)別面部。在這個(gè)設(shè)置中,所有的數(shù)據(jù)和處理都將在Pi上本地執(zhí)行,這意味著您的所有面部和數(shù)據(jù)都不會(huì)離開(kāi)Pi
    的頭像 發(fā)表于 07-29 17:27 ?1347次閱讀
    用樹(shù)莓派 + <b class='flag-5'>OpenCV</b> 打造人臉<b class='flag-5'>識(shí)別</b>技術(shù)!

    【Milk-V Duo S 開(kāi)發(fā)板免費(fèi)體驗(yàn)】SDK編譯、人臉檢測(cè)、OpenCV測(cè)試

    -mobile-test ./opencv-mobile-test 生成 200x200 尺寸的 out.jpg 圖像,即實(shí)現(xiàn)圖片壓縮。 該測(cè)試工程可結(jié)合物體識(shí)別模型,實(shí)現(xiàn)輸入圖像
    發(fā)表于 07-11 13:48

    基于LockAI視覺(jué)識(shí)別模塊:C++人臉識(shí)別

    本文基于RV1106做成的LockAI視覺(jué)識(shí)別模塊,采用 LZ-Picodet 模型訓(xùn)練的人臉檢測(cè)模型 LZ-Face,以及ArcFace人臉識(shí)別模型,實(shí)現(xiàn)人臉識(shí)別系統(tǒng)。 源代碼:ht
    發(fā)表于 07-01 12:01

    基于LockAI視覺(jué)識(shí)別模塊:手寫數(shù)字識(shí)別

    1.1 手寫數(shù)字識(shí)別簡(jiǎn)介 手寫數(shù)字識(shí)別是一種利用計(jì)算機(jī)視覺(jué)和機(jī)器學(xué)習(xí)技術(shù)自動(dòng)識(shí)別手寫數(shù)字的過(guò)程。它通過(guò)圖像預(yù)處理、特征提取和模型訓(xùn)練來(lái)實(shí)現(xiàn)高效準(zhǔn)確的數(shù)字
    發(fā)表于 06-30 16:45

    AI視覺(jué)識(shí)別收銀稱:水果生鮮店的“智能店員”

    水果生鮮店中,采用AI視覺(jué)識(shí)別收銀稱不僅提升了顧客的購(gòu)物體驗(yàn),也為商家?guī)?lái)了諸多便利和效益。本文將詳細(xì)介紹這一技術(shù)的好處。一、提升收銀效率傳統(tǒng)的收銀方式需要人工逐一識(shí)別商品并進(jìn)行稱重、計(jì)價(jià)
    的頭像 發(fā)表于 06-07 10:19 ?718次閱讀
    AI視覺(jué)<b class='flag-5'>識(shí)別</b>收銀稱:<b class='flag-5'>水果</b>生鮮店的“智能店員”

    OpenVINO?工具套件使用CRNN_CS模型運(yùn)行OpenCV* text_detection.cpp報(bào)錯(cuò)怎么解決?

    將 crnn_cs.onnx 文本識(shí)別模型轉(zhuǎn)換為中間表示 (IR): python mo.py --input_model crnn_cs.onnx 使用生成的 IR 文件運(yùn)行 OpenCV
    發(fā)表于 03-05 09:19