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

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

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

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

新機(jī)器視覺 ? 來源:OpenCV與AI深度學(xué)習(xí) ? 作者: Color Space ? 2021-07-06 11:02 ? 次閱讀

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

測試圖像與說明

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

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

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

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

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

效果演示:

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

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

具體步驟:

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

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

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

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

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

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)#根據(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)

#-------------------蘋果檢測-----------------# 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)

#-------------------橘子檢測-----------------# 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)

#-------------------白色餐盤檢測-----------------# 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)

#-------------------綠色餐盤檢測-----------------# 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)

#-------------------橙色餐盤檢測-----------------# 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ì)算價格--------------# 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é)尾語

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

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

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

—版權(quán)聲明—

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

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

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

編輯:jq

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

    關(guān)注

    30

    文章

    4671

    瀏覽量

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

    關(guān)注

    66

    文章

    8306

    瀏覽量

    131846
  • OpenCV
    +關(guān)注

    關(guān)注

    29

    文章

    622

    瀏覽量

    41091
  • python
    +關(guān)注

    關(guān)注

    53

    文章

    4753

    瀏覽量

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

    關(guān)注

    73

    文章

    5422

    瀏覽量

    120593

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

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

收藏 人收藏

    評論

    相關(guān)推薦

    如何實(shí)現(xiàn)Python復(fù)制文件操作

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

    OpenCV圖像識別C++代碼

    安裝OpenCV庫 首先,您需要在您的計(jì)算機(jī)上安裝OpenCV庫。您可以從OpenCV官網(wǎng)下載預(yù)編譯的庫或從源代碼編譯。安裝完成后,確保將OpenCV的頭文件和庫文件添加到您的項(xiàng)目中。
    的頭像 發(fā)表于 07-16 10:42 ?1098次閱讀

    opencv圖像識別有什么算法

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

    opencv-pythonopencv一樣嗎

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

    基于OpenCV的人臉識別系統(tǒng)設(shè)計(jì)

    基于OpenCV的人臉識別系統(tǒng)是一個復(fù)雜但功能強(qiáng)大的系統(tǒng),廣泛應(yīng)用于安全監(jiān)控、人機(jī)交互、智能家居等多個領(lǐng)域。下面將詳細(xì)介紹基于OpenCV的人臉識別系統(tǒng)的基本原理、
    的頭像 發(fā)表于 07-11 15:37 ?1.1w次閱讀

    itop-RK3588開發(fā)板機(jī)器視覺開發(fā)OpenCV-Python的安裝

    itop-RK3588開發(fā)板機(jī)器視覺開發(fā)OpenCV-Python的安裝
    的頭像 發(fā)表于 01-26 15:18 ?3246次閱讀
    itop-RK3588開發(fā)板機(jī)器視覺開發(fā)<b class='flag-5'>OpenCV-Python</b>的安裝

    如何使用Python進(jìn)行圖像識別的自動學(xué)習(xí)自動訓(xùn)練?

    如何使用Python進(jìn)行圖像識別的自動學(xué)習(xí)自動訓(xùn)練? 使用Python進(jìn)行圖像識別的自動學(xué)習(xí)和自動訓(xùn)練需要掌握一些重要的概念和技術(shù)。在本文中,我們將介紹如何使用
    的頭像 發(fā)表于 01-12 16:06 ?446次閱讀

    使用Python卷積神經(jīng)網(wǎng)絡(luò)(CNN)進(jìn)行圖像識別的基本步驟

    Python 卷積神經(jīng)網(wǎng)絡(luò)(CNN)在圖像識別領(lǐng)域具有廣泛的應(yīng)用。通過使用卷積神經(jīng)網(wǎng)絡(luò),我們可以讓計(jì)算機(jī)從圖像中學(xué)習(xí)特征,從而實(shí)現(xiàn)對圖像的分類、識別和分析等任務(wù)。以下是使用
    的頭像 發(fā)表于 11-20 11:20 ?4137次閱讀

    基于OpenVINO+OpenCV的OCR處理流程化實(shí)現(xiàn)

    預(yù)處理主要是基于OpenCV、場景文字檢測與識別基于OpenVINO框架 + PaddleOCR模型完成。直接按圖索驥即可得到最終結(jié)果。 OpenCV預(yù)處理主要是完成偏斜矯正、背景矯正等操作,然后使用場景文字檢測模型+OCR
    的頭像 發(fā)表于 11-07 11:21 ?617次閱讀
    基于OpenVINO+<b class='flag-5'>OpenCV</b>的OCR處理流程化<b class='flag-5'>實(shí)現(xiàn)</b>

    什么是常量折疊?Python如何優(yōu)雅地實(shí)現(xiàn)

    每種編程語言為了表現(xiàn)出色,并且實(shí)現(xiàn)卓越的性能,都需要大量編譯器級的優(yōu)化。 一種著名的優(yōu)化技術(shù)是“ 常量折疊 ”(Constant Folding):在編譯期間,編譯器會設(shè)法識別出常量表達(dá)式,對其進(jìn)行
    的頭像 發(fā)表于 10-30 11:10 ?416次閱讀
    什么是常量折疊?<b class='flag-5'>Python</b>如何優(yōu)雅地<b class='flag-5'>實(shí)現(xiàn)</b>它

    OpenCV基礎(chǔ)知識入門

    OpenCV是計(jì)算機(jī)視覺中最受歡迎的庫,最初由intel使用C和C ++進(jìn)行開發(fā)的,現(xiàn)在也可以在python中使用。該庫是一個跨平臺的開源庫,是免費(fèi)使用的。OpenCV庫是一個高度優(yōu)化的庫,主要關(guān)注實(shí)時應(yīng)用程序。
    的頭像 發(fā)表于 10-29 11:29 ?661次閱讀
    <b class='flag-5'>OpenCV</b>基礎(chǔ)知識入門

    智能車識別圖an用openmv還是用opencv

    智能車創(chuàng)意組識別圖an用openmv 還是用 opencv 比較好
    發(fā)表于 10-24 06:24

    關(guān)于兩個Python開源識別工具的效果

    回復(fù)希望出一篇 OCR 相關(guān)的文章,今天嘗試了一下 cnocr 和 tesseract 兩個 Python 開源識別工具的效果,給大家分別講講兩個工具的使用方法和對比效果。 1.準(zhǔn)備 開始之前,你要確保
    的頭像 發(fā)表于 10-17 11:36 ?523次閱讀
    關(guān)于兩個<b class='flag-5'>Python</b>開源<b class='flag-5'>識別</b>工具的效果

    【幸狐Core3566模組試用體驗(yàn)】基于openCV的貓臉識別

    本文主要介紹如何基于openCV實(shí)現(xiàn)一個簡單的貓臉識別應(yīng)用。
    的頭像 發(fā)表于 09-25 09:05 ?841次閱讀
    【幸狐Core3566模組試用體驗(yàn)】基于<b class='flag-5'>openCV</b>的貓臉<b class='flag-5'>識別</b>

    【幸狐 Core3566 模組試用體驗(yàn)】基于openCV的貓臉識別

    本文主要介紹如何基于openCV實(shí)現(xiàn)一個簡單的貓臉識別應(yīng)用。 一、基礎(chǔ)準(zhǔn)備 首先需要安裝openCV,因?yàn)?b class='flag-5'>python版的方便點(diǎn),所以直接
    發(fā)表于 09-24 23:50