在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

3天內不再提示

如何使用Python-OpenCV實現餐盤水果識別與計價的應用

新機器視覺 ? 來源:OpenCV與AI深度學習 ? 作者: Color Space ? 2021-07-06 11:02 ? 次閱讀

導讀本文主要介紹使用Python-OpenCV實現餐盤水果識別與計價的應用。

測試圖像與說明

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

餐盤/菜品識別一般方法:

(1)識別餐盤---傳統方法和機器學習/深度學習方法;

(2)識別菜品---機器學習/深度學習方法;

本文使用傳統方法識別餐盤。

效果演示:

算法思路與實現步驟

思路:傳統方法識別餐盤---依據顏色和形狀來區分。

具體步驟:

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

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

(3)計價:盤子和水果的數量乘以對應的單價即可;

(4)設計UI,計價時顯示收款碼。

Python-OpenCV實現算法核心代碼與效果如下:

def Recognize_Dish(self,img): #-------------------香蕉檢測-----------------# 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)#根據顏色范圍刪選 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)

#-------------------蘋果檢測-----------------# 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)#根據顏色范圍刪選 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,‘apple’,(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)

#-------------------橘子檢測-----------------# 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)#根據顏色范圍刪選 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)

#-------------------白色餐盤檢測-----------------# 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)#根據顏色范圍刪選 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)

#-------------------綠色餐盤檢測-----------------# 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)#根據顏色范圍刪選 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)

#-------------------橙色餐盤檢測-----------------# 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)#根據顏色范圍刪選 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) #----------------計算價格--------------# 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

結尾語

(1) 算法只針對水果和餐盤數量和形態較少的情形,方法供參考;

(2) 實際應用將更復雜,要求更高,一般開源的目標檢測網絡也很難滿足要求;

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

—版權聲明—

來源: OpenCV與AI深度學習

僅用于學術分享,版權屬于原作者。

若有侵權,請聯系刪除或修改!

編輯:jq

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

    關注

    30

    文章

    4837

    瀏覽量

    69129
  • 機器學習
    +關注

    關注

    66

    文章

    8446

    瀏覽量

    133126
  • OpenCV
    +關注

    關注

    31

    文章

    635

    瀏覽量

    41595
  • python
    +關注

    關注

    56

    文章

    4811

    瀏覽量

    85076
  • 深度學習
    +關注

    關注

    73

    文章

    5518

    瀏覽量

    121608

原文標題:應用實例 | 手把手教你用OpenCV實現餐盤水果識別計價程序(附代碼)

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

收藏 人收藏

    評論

    相關推薦

    使用Python實現xgboost教程

    使用Python實現XGBoost模型通常涉及以下幾個步驟:數據準備、模型訓練、模型評估和模型預測。以下是一個詳細的教程,指導你如何在Python中使用XGBoost。 1. 安裝XGBoost
    的頭像 發表于 01-19 11:21 ?446次閱讀

    【實戰】人工智能0基礎入門:基于Python+OpenCV的車牌識別項目(課程+平臺實踐)

    的車牌識別系統項目。02項目功能本項目致力于利用攝像頭捕獲的圖像數據,通過先進的圖像處理和模式識別技術,實現對車牌的自動檢測與識別。項目的核心在于精準的圖像預處理
    的頭像 發表于 12-16 10:43 ?433次閱讀
    【實戰】人工智能0基礎入門:基于<b class='flag-5'>Python+OpenCV</b>的車牌<b class='flag-5'>識別</b>項目(課程+平臺實踐)

    如何用OpenCV進行手勢識別--基于米爾全志T527開發板

    本文將介紹基于米爾電子MYD-LT527開發板(米爾基于全志T527開發板)的OpenCV手勢識別方案測試。摘自優秀創作者-小火苗米爾基于全志T527開發板一、軟件環境安裝1.安裝OpenCVsudoapt-getinstalllibopencv-devpython3-
    的頭像 發表于 12-13 08:04 ?867次閱讀
    如何用<b class='flag-5'>OpenCV</b>進行手勢<b class='flag-5'>識別</b>--基于米爾全志T527開發板

    【AI實戰項目】基于OpenCV的“顏色識別項目”完整操作過程

    適用于哪些場景,然后通過Python編寫代碼來實現這些算法,并應用于實際項目中,實現圖像的檢測、識別、分類、定位、測量等目標。華清遠見【python
    的頭像 發表于 12-09 16:42 ?504次閱讀
    【AI實戰項目】基于<b class='flag-5'>OpenCV</b>的“顏色<b class='flag-5'>識別</b>項目”完整操作過程

    RK3568 + OpenCV 會碰撞出什么火花?案例詳解:2-1 基于OpenCV的畫線實驗

    一系列 C 函數和少量 C++ 類構成,同時提供了Python、Ruby、MATLAB等語言的接口,實現了圖像處理和計算機視覺方面的很多通用算法。 OpenCV具有以下特點: 不管是科學研究,還是商業
    發表于 12-03 14:09

    一個月速成python+OpenCV圖像處理

    適用于哪些場景,然后通過Python編寫代碼來實現這些算法,并應用于實際項目中,實現圖像的檢測、識別、分類、定位、測量等目標。本文將介紹一個高效學習
    的頭像 發表于 11-29 18:27 ?208次閱讀
    一個月速成<b class='flag-5'>python+OpenCV</b>圖像處理

    如何用OpenCV的相機捕捉視頻進行人臉檢測--基于米爾NXP i.MX93開發板

    : breakvideo.release()cv2.destroyAllWindows() 保存后執行”python3 opencv_test.py OpenCV裝好后,可以為后面的人臉檢測提供可行性。 要
    發表于 11-15 17:58

    手寫圖像模板匹配算法在OpenCV中的實現

    OpenCV中的模板匹配是支持基于NCC相似度查找的,但是不是很好用,一個主要的原因是查找最大閾值,只能匹配一個,自己比對閾值,又導致無法正確設定閾值范圍,所以問題很多。于是我重新寫了純Python版本的NCC圖像模板匹配的代碼實現
    的頭像 發表于 11-11 10:12 ?333次閱讀
    手寫圖像模板匹配算法在<b class='flag-5'>OpenCV</b>中的<b class='flag-5'>實現</b>

    如何實現Python復制文件操作

    Python 中有許多“開蓋即食”的模塊(比如 os,subprocess 和 shutil)以支持文件 I/O 操作。在這篇文章中,你將會看到一些用 Python 實現文件復制的特殊方法。下面我們開始學習這九種不同的方法來
    的頭像 發表于 07-18 14:53 ?486次閱讀

    OpenCV圖像識別C++代碼

    安裝OpenCV庫 首先,您需要在您的計算機上安裝OpenCV庫。您可以從OpenCV官網下載預編譯的庫或從源代碼編譯。安裝完成后,確保將OpenCV的頭文件和庫文件添加到您的項目中。
    的頭像 發表于 07-16 10:42 ?2523次閱讀

    opencv圖像識別有什么算法

    OpenCV(Open Source Computer Vision Library)是一個開源的計算機視覺和機器學習軟件庫,提供了大量的圖像處理和計算機視覺相關的算法。以下是一些常見的OpenCV
    的頭像 發表于 07-16 10:40 ?1231次閱讀

    opencv-pythonopencv一樣嗎

    不一樣。OpenCV(Open Source Computer Vision Library)是一個開源的計算機視覺和機器學習軟件庫,它提供了大量的圖像和視頻處理功能。OpenCV-Python
    的頭像 發表于 07-16 10:38 ?1430次閱讀

    基于OpenCV的人臉識別系統設計

    基于OpenCV的人臉識別系統是一個復雜但功能強大的系統,廣泛應用于安全監控、人機交互、智能家居等多個領域。下面將詳細介紹基于OpenCV的人臉識別系統的基本原理、
    的頭像 發表于 07-11 15:37 ?1.6w次閱讀

    神經網絡的基本原理及Python編程實現

    神經網絡作為深度學習算法的基本構建模塊,模擬了人腦的行為,通過互相連接的節點(也稱為“神經元”)實現對輸入數據的處理、模式識別和結果預測等功能。本文將深入探討神經網絡的基本原理,并結合Python編程
    的頭像 發表于 07-03 16:11 ?857次閱讀

    基于OpenCV DNN實現YOLOv8的模型部署與推理演示

    基于OpenCV DNN實現YOLOv8推理的好處就是一套代碼就可以部署在Windows10系統、烏班圖系統、Jetson的Jetpack系統
    的頭像 發表于 03-01 15:52 ?1901次閱讀
    基于<b class='flag-5'>OpenCV</b> DNN<b class='flag-5'>實現</b>YOLOv8的模型部署與推理演示
    主站蜘蛛池模板: 九色欧美 | 国产伦子一区二区三区四区 | 狠狠干网站 | 五月天丁香花婷婷 | 精品一区二区视频 | 久久香蕉精品视频 | 日本成片视频 | 亚洲国产精品乱码在线观看97 | 你懂的视频在线观看资源 | 在线观看黄色x视频 | 久久国内视频 | 女人被男人免费播放网站 | 欧美视频一区二区三区四区 | 亚洲卡一卡2卡三卡4卡国色 | 扛着高跟鞋丝袜腿呻吟视频 | 国产福利在线观看你懂的 | 日本xxx69hd| 日本韩国做暖暖小视频 | 欧美成人aaaa免费高清 | 免费人成在线观看网站品爱网日本 | 两性午夜欧美高清做性 | 激情五月激情综合网 | 国产亚洲精品久久久极品美女 | 涩涩高清无乱码在线观看 | 午夜剧场黄色 | 成人18毛片 | 五月婷婷色| 亚洲最大的成网4438 | 午夜影视剧场 | www色午夜 | 欧美成人午夜视频 | 狠狠色伊人亚洲综合第8页 狠狠色依依成人婷婷九月 狠狠色影院 | 一区二区三区无码高清视频 | 亚洲高清日韩精品第一区 | 亚洲免费成人在线 | 黄网站色视频免费看无下截 | 你懂的在线观看视频 | 偷偷久久| 午夜小视频免费 | 欧美性白人极品1819hd | 制服丝袜国产精品 |