欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

OpenCV?NAO機(jī)器人輔助撿球丟球流程分析

 更新時間:2022年05月05日 14:49:17   作者:tilblackout  
這篇文章主要介紹了OpenCV?NAO機(jī)器人輔助撿球丟球,本項目使用NAO機(jī)器人識別球并撿起,然后將其扔到指定位置,主要涉及圖像的獲取、濾波、目標(biāo)物體定位和NAO機(jī)器人的運動控制,需要的朋友可以參考下

1. 概述

NAO機(jī)器人身高58cm,體重5.4kg。主要硬件包括CPU、主板、揚聲器、話筒、紅外線、相機(jī)、超聲波(聲吶)、傳感器、電機(jī)、語音合成器、陀螺儀等。實驗室中NAO機(jī)器人的型號為NAO
H25,其構(gòu)造如下:

NAO機(jī)器人的操作系統(tǒng)為Gentoo Linux,它支持Windows、Linux、Mac OS等操作系統(tǒng)的遠(yuǎn)程控制,可以在這些平臺上編程控制NAO。頭部CPU運行Linux內(nèi)核,支持Aldebaran Robotics內(nèi)核NAOqi,NAOqi提供了一組應(yīng)用程序接口(API)用于操作機(jī)器人,如控制機(jī)器人運動、拍攝、聲音識別、讀傳感器值等。使用C++、Python、.Net、Java、Matlab等語言可以調(diào)用這些API。

本項目使用NAO機(jī)器人識別球并撿起,然后將其扔到指定位置。主要涉及圖像的獲取、濾波、目標(biāo)物體定位和NAO機(jī)器人的運動控制。

整個流程大致為:獲取機(jī)器人頭部攝像頭的圖片,對圖片進(jìn)行一系列處理后,再根據(jù)霍夫圓檢測函數(shù)求出圖片中球的坐標(biāo)。這樣循環(huán)求取球的坐標(biāo),先左右移動機(jī)器人使球位于圖像的中間以防止球超出攝像頭范圍,再前后移動機(jī)器人使球位于圖片的最下方以便于接下來切換到嘴部攝像頭檢測球。接著讓機(jī)器人向前移動固定距離,然后切換到嘴部攝像頭進(jìn)行近距離檢測,與頭部攝像頭檢測類似,循環(huán)檢測并調(diào)整球的坐標(biāo)到預(yù)先設(shè)定的像素范圍內(nèi),即可調(diào)用錄制好的抓球動作將球撿起。最后機(jī)器人檢測垃圾桶的輪廓,過濾無關(guān)輪廓并根據(jù)輪廓重心和輪廓面積移動到指定位置,然后將球扔入垃圾桶內(nèi)即可。

需要解決的問題包括:

(1)OpenCV:圖像指定顏色提取與二值化,噪聲濾除、圓和垃圾桶的輪廓檢測與定位

(1)NAO機(jī)器人:攝像頭圖像的獲取、Animation模式下指定動作幀的錄制、根據(jù)檢測到的輪廓坐標(biāo)進(jìn)行運動控制

2. 相關(guān)技術(shù)

本項目主要用到了NAO機(jī)器人的運動控制和OpenCV圖像處理等技術(shù)。

2.1 NAO機(jī)器人

(1)啟動與連接

 按下NAO機(jī)器人胸口的按鈕即可啟動NAO。用戶可以通過以太網(wǎng)或Wi-Fi兩種方式連接計算機(jī)。第一次使用時先用以太網(wǎng)線連接NAO機(jī)器人,在機(jī)器人啟動之后再按下其胸口的按鈕,它會報出機(jī)器人的IP地址,接著在瀏覽器打開這個IP地址即可進(jìn)入NAO機(jī)器人的設(shè)置界面。該界面可以設(shè)置機(jī)器人的揚聲器音量,Wi-Fi連接、語言等功能。接著通過這個IP地址和固定端口號9559,即可使用C++、Python等編程語言通過TCP/IP協(xié)議與NAOqi進(jìn)行連接,調(diào)用NAOqi的API即可實現(xiàn)對NAO機(jī)器人的操作。

 另外,NAO實際是一臺計算能力足夠強(qiáng)的計算機(jī),它還提供了SSH(安全外殼協(xié)議)的遠(yuǎn)程登錄(Telnet)和文件傳輸(FTP)服務(wù)。通過遠(yuǎn)程登錄和文件傳輸服務(wù),可以像是用一臺裝有Linux操作系統(tǒng)的計算機(jī)那樣使用NAO。

(2)NAOqi

 在NAO上執(zhí)行NAOqi是通過一個代理程序(Broker)完成的。啟動機(jī)器人時,代理程序會自動加載/etc/naoqi/autoload.ini文件,這個文件中指定了需要加載NAOqi的哪些庫,這些庫文件位于/usr/lib/naoqi目錄下。一個庫包含一個或多個模塊,每個模塊定義了多種方法。例如NAO的運動功能都放在ALMotion模塊中,讓機(jī)器人完成移動、轉(zhuǎn)頭、張手等動作分別要調(diào)用ALMotion模塊中的moveto()、setAngles()、OpenHand()等方法。

 使用NAOqi模塊時,不需要像普通Python程序那樣用import語句導(dǎo)入所有模塊,模塊通過Broker通告它所提供的方法。通過Broker,任何模塊都可以找到所有已經(jīng)通告的模塊及方法。

 Broker主要由兩個作用:直接服務(wù),即查找模塊和方法;網(wǎng)絡(luò)訪問,即從Broker進(jìn)程外部調(diào)用模塊方法。Broker既是一個可執(zhí)行程序,也是一個服務(wù)器,可以對指定的IP和端口監(jiān)聽遠(yuǎn)程命令。通過IP和端口與調(diào)用NAOqi模塊的程序,既可以在機(jī)器人上運行,也可以在遠(yuǎn)程計算機(jī)上直接運行。一般來說Broker是透明的,在大部分情況下,編程時可以不考慮Broker,調(diào)用本地模塊的代碼與調(diào)用遠(yuǎn)程模塊的代碼是一樣的。

2.2 Choregraphe

 Choregraphe是NAO提供的編程環(huán)境,用該軟件可以創(chuàng)建應(yīng)用于NAO機(jī)器人的行為模塊,并可以將其上傳至所連接的機(jī)器人進(jìn)行測試。Choregraphe采用的是圖形化編程,創(chuàng)建復(fù)雜性為模塊不需要用戶編寫任何一條代碼,Choregraphe也提供用戶自定義功能,允許使用Python語言編寫自定義模塊。在本次撿球程序中主要使用了該軟件的時間軸指令盒和Animation模式來錄制用戶想讓機(jī)器人完成的動作。

2.3 OpenCV

 OpenCV是一個跨平臺的計算機(jī)視覺庫,它是由英特爾公司發(fā)起并參與開發(fā),以BSD許可證授權(quán)發(fā)行,可以在商業(yè)和研究領(lǐng)域中免費使用。OpenCV可用于開發(fā)實時的圖像處理、計算機(jī)視覺以及模式識別程序。OpenCV可用于解決如下領(lǐng)域的問題:增強(qiáng)現(xiàn)實、人臉識別、手勢識別、人機(jī)交互、動作識別、運動跟蹤、物體識別、圖像分割、機(jī)器人。

 OpenCV使用C++語言編寫,它的主要接口也是C++語言,但是依然保留了大量的C語言接口。該庫也有大量的Python,Java and MATLAB的接口,本項目中主要在Python中使用OpenCV接口。

3. 總體設(shè)計與詳細(xì)設(shè)計

系統(tǒng)主要分為三大模塊,分別為:姿勢控制、運動控制、OpenCV視覺處理。

3.1 系統(tǒng)模塊劃分

一、姿勢控制

由于需要根據(jù)攝像頭的圖像識別球,而機(jī)器人的不同姿勢決定了機(jī)器人的視覺范圍,所以在不同情況下需要指定機(jī)器人保持不同的姿勢。

二、運動控制

機(jī)器人需要抓球與扔球,而整個動作序列通過填寫不同幀時刻各個關(guān)節(jié)的角度值則不僅難以達(dá)到理想的效果,而且會花費大量的精力。所以這里通過Choregraphe的Animation模式對動作的關(guān)鍵幀進(jìn)行錄制。

三、OpenCV視覺處理與機(jī)器人移動

完成抓球和丟球最核心的工作就是對攝像頭獲取的圖像進(jìn)行處理并控制機(jī)器人的移動,圖像處理主要通過OpenCV提供的API對圖像進(jìn)行去噪、模糊、顏色提取、輪廓檢測,而機(jī)器人的移動主要是通過獲取的輪廓的像素信息控制機(jī)器人移動到指定位置。

3.2 主要功能模塊

一、姿勢控制
如下圖所示,NAO機(jī)器人使用旋轉(zhuǎn)集合橫滾(roll)、俯仰(pitch)和偏轉(zhuǎn)(yaw)表示運動姿態(tài),分別對應(yīng)繞X、Y、Z軸方向上的旋轉(zhuǎn)。在描述關(guān)節(jié)的運動范圍時,沿旋轉(zhuǎn)軸順時針方向轉(zhuǎn)動為負(fù),逆時針轉(zhuǎn)動為正。

NAO機(jī)器人的每個關(guān)節(jié)名稱由部件名稱+姿態(tài)名稱組成,如HeadYaw表示機(jī)器人頭部左右旋轉(zhuǎn)的關(guān)節(jié)。經(jīng)過測試,本項目中初始化動作為ShoulderPitch為80度,ShoulderRoll為20度,HipPitch為-25度,KneePitch為40度,AnklePitch為-20度,其它關(guān)節(jié)均為0度。將上述關(guān)節(jié)和角度寫入一個list中,然后調(diào)用ALMotion中的angleInterpolationWithSpeed函數(shù)調(diào)整機(jī)器人的姿勢。

二、運動控制

 打開Choregraphe-右鍵創(chuàng)建指令盒-時間軸,雙擊創(chuàng)建的時間軸即可編輯機(jī)器人的動作,可以在不同幀時刻存儲NAO身體某個關(guān)節(jié)或全部關(guān)節(jié)的角度信息來完成動作的錄制。而NAO機(jī)器人在正常模式下所有關(guān)節(jié)的剛度為1,不能移動其關(guān)節(jié)。而在Animation模式下,機(jī)器人的眼睛和腳部LED的顏色如果是橙色則表示剛度為1,可通過觸摸其手部和腳部讓LED的顏色變?yōu)榫G色,這就可以隨意的調(diào)整機(jī)器人的不同關(guān)節(jié),調(diào)整完后在軟件中記錄這個關(guān)鍵幀即可。

 兩個關(guān)鍵幀之間的動作可以通過貝塞爾曲線來模擬生成一個平滑的動作曲線以保證機(jī)器人動作的正常執(zhí)行。調(diào)整完動作后,可以生成對應(yīng)的C++/Python代碼。

三、OpenCV視覺處理與機(jī)器人移動

(1)NAO攝像頭的捕捉

 NAO頭部有兩個相機(jī),用于識別視野中的物體,其中前額相機(jī)主要用于拍攝遠(yuǎn)景圖像,嘴部相機(jī)主要用于拍攝下方圖像。相機(jī)的可選分辨率有6種,最高為1280x960px,這里設(shè)置為640x480px。

 獲取圖像:首先連接ALVideoDevice模塊,再調(diào)用subscribe函數(shù)訂閱圖像,該函數(shù)可以設(shè)置圖片的分辨率、獲取圖片的色彩空間等參數(shù)。最后調(diào)用getImageRemote即可從攝像頭中獲取一個圖像數(shù)組,其中0號和1號元素為圖像的寬、高,6號元素為圖像數(shù)據(jù)。獲取圖像后將圖像轉(zhuǎn)為numpy格式并返回。

 與RGB相比,HSV色彩空間不會隨光照強(qiáng)度的變化而發(fā)生劇烈變化,目標(biāo)物體顏色值也不會出現(xiàn)較大的偏差,一定程度上減弱了光照條件對機(jī)器人視覺系統(tǒng)的影響,增強(qiáng)了機(jī)器人視覺系統(tǒng)的自適應(yīng)能力。所以獲取RGB色彩空間的圖像之后,通常將其轉(zhuǎn)化為HSV色彩空間進(jìn)行檢測。

def getImage(IP, PORT, flag):
    camProxy = ALProxy("ALVideoDevice", IP, PORT)
    resolution = 2    # 640x480
    colorSpace = 11   # RGB
    # 頭部/嘴部攝像頭
    camProxy.setParam(18, flag)
    videoClient = camProxy.subscribe("python_client", resolution, colorSpace, 5)
    naoImage = camProxy.getImageRemote(videoClient)
    camProxy.unsubscribe(videoClient)
    imageWidth = naoImage[0]
    imageHeight = naoImage[1]
    array = naoImage[6]
    im = Image.frombytes("RGB", (imageWidth, imageHeight), array)
    ci = np.array(im)  # 轉(zhuǎn)化成numpy格式圖像
    r, g, b = cv2.split(ci)  # opencv的圖像為BGR因此需要轉(zhuǎn)換一下
    ci = cv2.merge([b, g, r])
    return ci

(2)球檢測

紅球主要通過霍夫圓變換進(jìn)行檢測,具體步驟如下:

1、從機(jī)器人的相機(jī)中獲取圖像,并將其轉(zhuǎn)化為HSV色彩空間的圖像。

2、接著根據(jù)HSV顏色范圍表提取指定顏色范圍,以綠球為例,其HSV的范圍為[35,43,46]至[77,255,255],調(diào)用inRange函數(shù)提取出綠色色彩空間。但實際測試效果并不好,會將周圍環(huán)境中無關(guān)的內(nèi)容提取出來,而實驗中使用的綠球較鮮艷,經(jīng)測試將HSV的下限中的S(飽和度)調(diào)高至128即可較好的提取出綠色色彩空間。

3、對圖像進(jìn)行高斯模糊以消除圖片中的噪聲,內(nèi)核取7x7的矩陣。

4、進(jìn)行一次開操作,即先腐蝕后膨脹以進(jìn)一步消除噪聲。

5、觀察此時的圖像,除了被檢測的球,還有很多位置有斷斷續(xù)續(xù)的白色。所以先取反然后進(jìn)行三次閉操作(先膨脹再腐蝕),內(nèi)核取15x15的矩陣。

6、此時得到的二值圖較為理想,圖像處理過程結(jié)果如下圖所示:

7、調(diào)用HoughCircles進(jìn)行霍夫圓檢測,具體參數(shù)如下:

cv2.HoughCircles(np.uint8(dilated),cv2.HOUGH_GRADIENT,1,100,param1=100,param2=7,minRadius=2,
maxRadius=60)

其中:

第一個參數(shù)為輸入圖像

第二個參數(shù)檢測方法選擇霍夫梯度法

第三個參數(shù)為累加面分辨率大小,這里設(shè)置為1表示分辨率與原圖像相同

第四個參數(shù)為param1,即Canny邊緣檢測的高閾值

第五個參數(shù)為param2,其值越小檢測圓的限制就越低

第六個參數(shù)為檢測的最小圓半徑

第七個參數(shù)為檢測的最大圓半徑

8、如果濾波效果好的話,能檢測出圖中所有圓圓心坐標(biāo)和半徑,這里假設(shè)僅有一個綠球,所以最終判斷如果檢測出來的結(jié)果中只有一個圓的話,返回該圓的圓心坐標(biāo)。

以上即為檢測球圓心的步驟,具體調(diào)用時,連續(xù)獲取10次攝像頭圖像并檢測球圓心,排序后,如果中間元素為(0,0)表示沒有檢測到球,否則將其返回。

(3)抓球

由于NAO機(jī)器人蹲下抓取地上的球時姿勢保持太久容易發(fā)熱導(dǎo)致機(jī)器人需要散熱才能繼續(xù)使用,由于這需要大量時間和經(jīng)驗,而實訓(xùn)時間有限,所以這里將球放置在高21cm的平臺上供機(jī)器人抓取。

首先在Choregraphe中打開Animation模式,然后記錄3個關(guān)鍵幀:

(1)將手掌打開以防止手觸碰到平臺部分

(2)將機(jī)器人的右手移動到球上方的一點的高度

(3)接著將右手從右往左移動以保證球能在手掌中。

將上述三個關(guān)鍵幀生成代碼后在Python中測試,開始上述動作之前需要調(diào)用ALMotion中的openHand函數(shù)打開機(jī)器人的手掌,上述動作完成后再調(diào)用closeHand抓起球。

(4)球定位

將機(jī)器人放置到固定位置,然后測試上述的動作能順利的將球抓起。記錄此時機(jī)器人與球的相對位置:前腳離平臺9cm、瓶蓋圓心與右腿膝蓋的右側(cè)平行。接著在這個位置調(diào)用之前的球檢測函數(shù),在機(jī)器人使用嘴部攝像頭且髖部HipPitch和膝部KneePitch為-25和+40時,球的坐標(biāo)大概在(523.5,426.5),由于此時機(jī)器人離球很近,所以這里允許X、Y坐標(biāo)都有25像素的偏差,經(jīng)測試在這個偏差范圍內(nèi)可以將球抓起。

上述為嘴部攝像頭的參數(shù)確定,而剛開始由于機(jī)器人離球有一定距離,需要用前額攝像頭拍攝球。所以剛開始將機(jī)器人保持在固定動作,然后用前額攝像頭檢測球,根據(jù)檢測出的球坐標(biāo)對(x,y)進(jìn)行調(diào)整。首先希望球位于到攝像頭的最底端,這里實時檢測球的位置,讓機(jī)器人向前移動,將y增大到430以上。接著希望球能位于攝像頭的最中心,所以實時檢測球?qū)⑵鋢坐標(biāo)調(diào)整到290~350之間。

接著讓機(jī)器人前進(jìn),直到能從嘴部攝像頭中檢測到綠球。根據(jù)前面的測試,將球坐標(biāo)穩(wěn)定于(523.5,426.5),且允許有25px的偏差即可。所以與前額攝像頭的步驟一樣,先調(diào)整y坐標(biāo)再調(diào)整x坐標(biāo)。

這里要注意的是,由于ALMotion模塊中機(jī)器人前進(jìn)或后退的函數(shù)執(zhí)行過程中會的受一些客觀條件的影響,機(jī)器人往往會往左或往右偏離一定的角度。所以在機(jī)器人左右或前后移動后,判斷其x或y坐標(biāo)的偏差,如調(diào)整x坐標(biāo)時,y坐標(biāo)的偏差超過一定閾值則認(rèn)為機(jī)器人的移動出現(xiàn)了偏離,所以向左或向右旋轉(zhuǎn)一定的角度進(jìn)行補(bǔ)償。

最后調(diào)用之前錄制好的抓球動作進(jìn)行抓球即可。

(5)垃圾桶定位

這里希望將抓取到的球扔到紅色垃圾桶中,同樣通過機(jī)器人的攝像頭獲取圖像,然后進(jìn)行均值偏移濾波和中值濾波,再將圖像轉(zhuǎn)到HSV空間,提取紅色的HSV范圍。接著將結(jié)果進(jìn)行二值化,再調(diào)用OpenCV中的findContour函數(shù)檢測輪廓,這里根據(jù)垃圾桶與機(jī)器人的距離等參數(shù)測試,可得到垃圾桶在一定距離內(nèi)的面積范圍,根據(jù)這個范圍選取出一個輪廓,再通過輪廓的結(jié)果可以計算出輪廓的重心坐標(biāo)。

將上述檢測垃圾桶重心的功能封裝成一個函數(shù),其返回值為輪廓的重心坐標(biāo)。這里將垃圾桶放置在機(jī)器人的左側(cè)。在機(jī)器人抓起球后,首先后退25cm左右,這樣做是防止機(jī)器人旋轉(zhuǎn)時被平臺擋住。然后將機(jī)器人旋轉(zhuǎn)60°,保證垃圾桶在機(jī)器人攝像頭范圍內(nèi)。后續(xù)步驟與檢測球的步驟類似,首先調(diào)整機(jī)器人的Y坐標(biāo)至340左右,接著調(diào)整X坐標(biāo)在[300,335]范圍內(nèi),最后機(jī)器人前進(jìn)一定的距離即可走到垃圾桶的面前。

(6)丟球

同樣通過Choregraphe的Animation模式來錄制動作,只需記錄機(jī)器人手部的動作,共記錄兩幀:張開右臂和移動右臂到正中間。由于垃圾桶的直徑相較于球來說大得多,所以允許的偏差范圍也更大,成功率也更高。

生成Python代碼,執(zhí)行上述動作無誤后,調(diào)用ALMotion模塊中的openHand將球放入垃圾桶中。

4 視頻展示

NAO機(jī)器人識別球并抓取丟到垃圾桶

識別的慢是這個NAO機(jī)器人內(nèi)部的伺服驅(qū)動模塊壞了,調(diào)用它的前進(jìn)函數(shù)就會走歪。我就把步幅放慢,慢慢識別,同時還有左右走歪調(diào)整的函數(shù)。換一個沒壞的NAO機(jī)器人就不會有這個問題了。

到此這篇關(guān)于OpenCV NAO機(jī)器人輔助撿球丟球的文章就介紹到這了,更多相關(guān)OpenCV 機(jī)器人撿球丟球內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Linux下編譯安裝MySQL-Python教程

    Linux下編譯安裝MySQL-Python教程

    這篇文章主要介紹了Linux下編譯安裝MySQL-Python教程,本文使用編譯方式安裝,提供下載地址和測試安裝成功方法,需要的朋友可以參考下
    2015-02-02
  • 如何使用pip安裝清華大學(xué)鏡像源

    如何使用pip安裝清華大學(xué)鏡像源

    這篇文章主要為大家介紹了如何使用pip安裝清華大學(xué)鏡像源步驟詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-10-10
  • 利用scrapy將爬到的數(shù)據(jù)保存到mysql(防止重復(fù))

    利用scrapy將爬到的數(shù)據(jù)保存到mysql(防止重復(fù))

    這篇文章主要給大家介紹了關(guān)于利用scrapy將爬到的數(shù)據(jù)保存到mysql(防止重復(fù))的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起看看吧。
    2018-03-03
  • Python的logging模塊基本用法

    Python的logging模塊基本用法

    這篇文章主要介紹了Python的logging模塊基本用法,幫助大家更好的理解和使用python,感興趣的朋友可以了解下
    2020-12-12
  • python檢測服務(wù)器是否正常

    python檢測服務(wù)器是否正常

    本文介紹使用python檢測服務(wù)器是否正常,程序的端口是否正常,需要的朋友可以參考下
    2014-02-02
  • Python四大金剛之元組詳解

    Python四大金剛之元組詳解

    這篇文章主要介紹了Python的元組,小編覺得這篇文章寫的還不錯,需要的朋友可以參考下,希望能夠給你帶來幫助
    2021-10-10
  • python else語句在循環(huán)中的運用詳解

    python else語句在循環(huán)中的運用詳解

    這篇文章主要介紹了python else語句在循環(huán)中的運用詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • python 實現(xiàn)視頻 圖像幀提取

    python 實現(xiàn)視頻 圖像幀提取

    今天小編就為大家分享一篇python 實現(xiàn)視頻 圖像幀提取,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • Django自定義全局403、404、500錯誤頁面的示例代碼

    Django自定義全局403、404、500錯誤頁面的示例代碼

    這篇文章主要介紹了Django自定義全局403、404、500錯誤頁面的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • python溫度轉(zhuǎn)換華氏溫度實現(xiàn)代碼

    python溫度轉(zhuǎn)換華氏溫度實現(xiàn)代碼

    這篇文章主要介紹了python溫度轉(zhuǎn)換華氏溫度實現(xiàn)代碼內(nèi)容,有需要的朋友們可以測試下。
    2020-12-12

最新評論