Unity | 如何调用摄像头拍照
我只用了PC端,其他平臺(tái)我沒試過哈~
一、攝像頭進(jìn)入unity的過程
1.常見的輸入內(nèi)容
常見的輸入內(nèi)容:聲音、圖片(影像就是一連串圖片不停的放,所以攝像頭發(fā)給電腦的實(shí)際上是很多很多圖片)
常見的輸入設(shè)備:輸入聲音對(duì)應(yīng)的設(shè)備一般是麥克風(fēng),圖片對(duì)應(yīng)的設(shè)備一般設(shè)攝像頭。
2.unity獲取設(shè)備訪問權(quán)限
Application(類):這個(gè)類里面,都是在應(yīng)用運(yùn)行的時(shí)候,去獲取和控制一些信息的。
RequestUserAuthorization(方法):在上面Application(類)里面,有一個(gè)方法,就是可以獲取麥克風(fēng)和攝像頭設(shè)備的輸入信息。
3.攝像機(jī)和麥克風(fēng)
UserAuthorization:攝像頭和麥克風(fēng),都在UserAuthorization里面。
攝像設(shè)備:UserAuthorization.WebCam
麥克風(fēng):UserAuthorization.Microphone
4.獲取到攝像機(jī)的代碼部分
因?yàn)樾枰?jì)算機(jī)去詢問:“你讓不讓我用呀,能不能給我呀?”
所以,我們不能用普通的方法,我們需要等待它問完。
因此,我們只能用攜程。
IEnumerator OpenCamera() {yield return Application.RequestUserAuthorization(UserAuthorization.WebCam); }5.得知是否可以訪問
HasUserAuthorization:獲得“你給不給用?”這句話的答案。這個(gè)答案也要通過Application
如果可以用,我們就說,相機(jī)照到啦,如果不可以用,我們就說,相機(jī)找不到!
IEnumerator OpenCamera() {yield return Application.RequestUserAuthorization(UserAuthorization.WebCam);//這小節(jié)內(nèi)容if (Application.HasUserAuthorization(UserAuthorization.WebCam)){Debug.Log("找到相機(jī)");}else {Debug.Log("沒找到相機(jī)");}}二、獲取到攝像頭中的圖片
1.攝像頭中的圖片的方法
?WebCamTexture(string?deviceName, int?requestedWidth, int?requestedHeight);
這個(gè)方法可以獲取到攝像頭當(dāng)前的圖片,但是它需要一些信息
deviceName:攝像機(jī)的名稱
requestedWidth:你希望讀出來的圖片寬是多少?(這里假設(shè)我要1920)
requestedHeight:你希望讀出來的圖片高是多少?(這里假設(shè)我要1080)
注意:讀取出來的圖片是屬于WebCamTexture
2.如何獲取攝像機(jī)的名字
首先應(yīng)該獲取所有插在電腦上的攝像機(jī)。
WebCamDevice:攝像機(jī)屬于的類
WebCamTexture.devices:獲取所有插在電腦上的攝像機(jī)的方法
IEnumerator OpenCamera() {yield return Application.RequestUserAuthorization(UserAuthorization.WebCam);if (Application.HasUserAuthorization(UserAuthorization.WebCam)){Debug.Log("找到相機(jī)");//本節(jié)內(nèi)容//獲取所有攝像機(jī)WebCamDevice[] devices = WebCamTexture.devices;//我們可能插很多攝像機(jī),所以我們用了一個(gè)數(shù)組來接收WebCamDevice[] devices}else {Debug.Log("沒找到相機(jī)");}}我們就用找到的第一臺(tái)攝像機(jī)就行了,所以我們只需要第一臺(tái)的名字
//本節(jié)內(nèi)容string CameraName;IEnumerator OpenCamera() {yield return Application.RequestUserAuthorization(UserAuthorization.WebCam);if (Application.HasUserAuthorization(UserAuthorization.WebCam)){Debug.Log("找到相機(jī)");//獲取所有攝像機(jī)WebCamDevice[] devices = WebCamTexture.devices;//本節(jié)內(nèi)容CameraName = devices[0].name;}else {Debug.Log("沒找到相機(jī)");}}3.獲取圖片并賦值
現(xiàn)在我們獲取到如下方法所需要的所有資料
WebCamTexture(string?deviceName, int?requestedWidth, int?requestedHeight);
WebCamTexture pics = new WebCamTexture(CameraName, 1920, 1080);注:這里的WebCamTexture可以和Texture通用
所以,我在外面和代碼各建了一個(gè)RawImage用來傳遞獲取到的圖片
?把圖一拖給圖二。
string CameraName;//小節(jié)內(nèi)容[SerializeField] RawImage rawImage;WebCamTexture pics;private void Start(){StartCoroutine(OpenCamera());}IEnumerator OpenCamera() {yield return Application.RequestUserAuthorization(UserAuthorization.WebCam);if (Application.HasUserAuthorization(UserAuthorization.WebCam)){Debug.Log("找到相機(jī)");//獲取所有攝像機(jī)WebCamDevice[] devices = WebCamTexture.devices;CameraName = devices[0].name;pics = new WebCamTexture(CameraName,1920, 1080);//小節(jié)內(nèi)容rawImage.texture = pics;//啟用攝像機(jī)pics.Play();}else {Debug.Log("沒找到相機(jī)");}}?這樣就可以獲取攝像頭了。
上面如果獲取到的圖像非常卡,可以把?
WebCamTexture pics = new WebCamTexture(CameraName,1920, 1080);
里面1920和1080降低一點(diǎn),
如果實(shí)在不知道放多少,可以放0,0,他會(huì)自己默認(rèn)給個(gè)數(shù)。
三、拍照功能
拍照有兩種:
1.你只要這個(gè)相片
2.除了這個(gè)相片還想要界面里的邊框呀之類
1.只要照片
相機(jī)之前是一直在刷新的,所以現(xiàn)在我們讓它先停下來;
pics.Stop();停下來之后,最后一張圖是存在?rawImage里面的,我們直接把這張圖保存下來就可以了。
這個(gè)保存的代碼就是在截圖拍照的最后幾句代碼。
2.截圖拍照
其實(shí)這里也可以分為全屏截圖和區(qū)域截圖,這里只講區(qū)域截圖。
區(qū)域截圖:就是在諾大的界面中,選一塊長(zhǎng)方形進(jìn)行截圖(其他形狀這里也不討論)。
a.Rect
在unity中,長(zhǎng)方體就是Rect,所以我們建一個(gè)Rect。
[SerializeField] Rect rect;如果你掛到了物體上,你就可以看見下圖:
這個(gè)圖也很好理解,你要一個(gè)長(zhǎng)方形,必須要給他W(寬),H(高),和它的位置(x,y)。
但是這里要了解一個(gè)事情:
Rect的坐標(biāo)是左下角是(0,0)。
?現(xiàn)在我們要去填這四個(gè)數(shù)。那么我們要確定一下,我們要截圖哪部分,拿Image在圖里面比一下。
假設(shè)我需要綠色的這部分。
?注意,這個(gè)Image要放在Canvas下面,否則坐標(biāo)還要去調(diào)。
?因?yàn)閯偛耪f的,Rect的零點(diǎn)在左下角,所以我們要把這個(gè)Image的零點(diǎn)改到左下角。
?
這會(huì)上面的數(shù)據(jù)就可以用了:
?
?這里給他取個(gè)整吧。
到這里,我們的方框的位置,和大小,就是這個(gè)Image的位置和大小了。
可以把Image刪掉了。
b.根據(jù)方塊塊的位置截圖
IEnumerator TakePic0() { pics.Stop();yield return new WaitForEndOfFrame();//先建一個(gè)和想截圖一樣大小的Texture2DTexture2D texture = new Texture2D((int)rect.width, (int)rect.height, TextureFormat.RGB24, true);//讓這個(gè)texture讀取一下現(xiàn)在方塊塊那塊位置的圖texture.ReadPixels(rect, 0, 0);//讓這個(gè)texture應(yīng)用一下剛才方塊塊的圖,就是和我們做完文件點(diǎn)保存是一個(gè)意思texture.Apply();//把圖片轉(zhuǎn)成PNG格式byte[] bytes = texture.EncodeToPNG();//寫一下你打算保存到哪string s = Application.streamingAssetsPath+"/0.png";//最后把轉(zhuǎn)換好的格式,保存在你想保存的地址里System.IO.File.WriteAllBytes(s, bytes);}?四、后面發(fā)現(xiàn)什么問題,還是會(huì)不定時(shí)更新的
?
總結(jié)
以上是生活随笔為你收集整理的Unity | 如何调用摄像头拍照的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: React Native资源汇总
- 下一篇: 单片机--定时器/计数器实验