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