WebCamTexture 在第一秒或第二秒出现全 0
WebCamTexture Coming Up With All 0s in the First Second or Two
我正在使用 WebCamTexture,我在我的 Start
方法中启动它,然后我 运行 另一种方法。我使用 GetPixels()
获取像素,但是,它们都显示为 (0, 0, 0)
。有没有解决这个问题或我可以等待的方式(Unity 似乎使用 while
循环和 WaitForSeconds
崩溃)。这是我当前的启动方法:
void Start () {
rawImage = gameObject.GetComponent<RawImage> ();
rawImageRect = rawImage.GetComponent<RectTransform> ();
webcamTexture = new WebCamTexture();
rawImage.texture = webcamTexture;
rawImage.material.mainTexture = webcamTexture;
webcamTexture.Play();
Method ();
loadingTextObject.SetActive (false);
gameObject.SetActive (true);
}
void Method(){
print (webcamTexture.GetPixels [0]);
}
并且每次都会打印 (0, 0, 0)
颜色。
在协程中执行网络摄像头操作,然后使用 yield return new WaitForSeconds(2);
等待 2 秒,然后再调用 webcamTexture.GetPixels
。
void Start () {
rawImage = gameObject.GetComponent<RawImage> ();
rawImageRect = rawImage.GetComponent<RectTransform> ();
StartCoroutine(startWebCam());
loadingTextObject.SetActive (false);
gameObject.SetActive (true);
}
private IEnumerator startWebCam()
{
webcamTexture = new WebCamTexture();
rawImage.texture = webcamTexture;
rawImage.material.mainTexture = webcamTexture;
webcamTexture.Play();
//Wait for 2 seconds
yield return new WaitForSeconds(2);
//Now call GetPixels
Method();
}
void Method(){
print (webcamTexture.GetPixels [0]);
}
或者像乔在评论区说的那样。等待几秒钟是不可靠的。您可以在阅读之前等待宽度有一些东西 it.Just 替换
yield return new WaitForSeconds(2);
和
while (webcamTexture.width < 100)
{
yield return null;
}
当您抓取所请求图像的大小时,两秒钟可能会花费很多时间。
WebCamTexture 有一个您可以访问的请求 width/height,它会在调用一次 GetPixels 后保存纹理的 "real" width/height。我们在与用户共享照片的两个项目中使用了名为 CameraCaptureKit (https://www.assetstore.unity3d.com/en/#!/content/56673 ) 的资产。
那里使用的代码采用 WebCamTexture 并抓取每一帧的帧,直到它 returns 纹理的宽度和高度。
在更新函数中调用了 TryDummySnapshot,直到正确返回大小。
// ANDREAS added this: In some cases we apparently don't get correct width and height until we have tried to read pixels
// from the buffer.
void TryDummySnapshot( ) {
if(!gotAspect) {
if( webCamTexture.width>16 ) {
if( Application.platform == RuntimePlatform.IPhonePlayer ) {
if(verbose)Debug.Log("Already got width height of WebCamTexture.");
} else {
}
gotAspect = true;
} else {
if(verbose)Debug.Log ("Taking dummy snapshot");
if( tmpImg == null ) {}
Color32[] c = webCamTexture.GetPixels32();
}
}
}
如果您不想等到报告或分配大小并且目标平台是 iOS (iPhone/iPad),也可以编写一个直接从中获取大小的插件通过扩展 CameraCapture.mm Unity 中的相机代码:
- (void)captureOutput:(AVCaptureOutput*)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection*)connection
{
intptr_t tex = (intptr_t)CMVideoSampling_SampleBuffer(&self->_cmVideoSampling, sampleBuffer, &self->_width, &self->_height);
_staticWebCamTexWidth = self->_width;
_staticWebCamTexWidth = self->_height;
UnityDidCaptureVideoFrame(tex, self->_userData);
if( self.firstFrameCallback!=nil ) {
[self fireFirstFrame];
}
}
self->width / height 可以在作为插件方法添加的方法中返回,例如:
[DllImport("__Internal")]
private static extern int GetWebCamTextureWidth ();
[DllImport("__Internal")]
private static extern int GetWebCamTextureHeight ();
然后在对象代码中
extern "C" int GetWebCamTextureWidth() { return _staticWebCamTexWidth; }
extern "C" int GetWebCamTextureHeight() { return _staticWebCamTexHeight; }
这是我为使用 unity 的 iOS 社交游戏之一提出的解决方案。在 Android 我们又回到了之前描述的方法。
我正在使用 WebCamTexture,我在我的 Start
方法中启动它,然后我 运行 另一种方法。我使用 GetPixels()
获取像素,但是,它们都显示为 (0, 0, 0)
。有没有解决这个问题或我可以等待的方式(Unity 似乎使用 while
循环和 WaitForSeconds
崩溃)。这是我当前的启动方法:
void Start () {
rawImage = gameObject.GetComponent<RawImage> ();
rawImageRect = rawImage.GetComponent<RectTransform> ();
webcamTexture = new WebCamTexture();
rawImage.texture = webcamTexture;
rawImage.material.mainTexture = webcamTexture;
webcamTexture.Play();
Method ();
loadingTextObject.SetActive (false);
gameObject.SetActive (true);
}
void Method(){
print (webcamTexture.GetPixels [0]);
}
并且每次都会打印 (0, 0, 0)
颜色。
在协程中执行网络摄像头操作,然后使用 yield return new WaitForSeconds(2);
等待 2 秒,然后再调用 webcamTexture.GetPixels
。
void Start () {
rawImage = gameObject.GetComponent<RawImage> ();
rawImageRect = rawImage.GetComponent<RectTransform> ();
StartCoroutine(startWebCam());
loadingTextObject.SetActive (false);
gameObject.SetActive (true);
}
private IEnumerator startWebCam()
{
webcamTexture = new WebCamTexture();
rawImage.texture = webcamTexture;
rawImage.material.mainTexture = webcamTexture;
webcamTexture.Play();
//Wait for 2 seconds
yield return new WaitForSeconds(2);
//Now call GetPixels
Method();
}
void Method(){
print (webcamTexture.GetPixels [0]);
}
或者像乔在评论区说的那样。等待几秒钟是不可靠的。您可以在阅读之前等待宽度有一些东西 it.Just 替换
yield return new WaitForSeconds(2);
和
while (webcamTexture.width < 100)
{
yield return null;
}
当您抓取所请求图像的大小时,两秒钟可能会花费很多时间。
WebCamTexture 有一个您可以访问的请求 width/height,它会在调用一次 GetPixels 后保存纹理的 "real" width/height。我们在与用户共享照片的两个项目中使用了名为 CameraCaptureKit (https://www.assetstore.unity3d.com/en/#!/content/56673 ) 的资产。
那里使用的代码采用 WebCamTexture 并抓取每一帧的帧,直到它 returns 纹理的宽度和高度。
在更新函数中调用了 TryDummySnapshot,直到正确返回大小。
// ANDREAS added this: In some cases we apparently don't get correct width and height until we have tried to read pixels
// from the buffer.
void TryDummySnapshot( ) {
if(!gotAspect) {
if( webCamTexture.width>16 ) {
if( Application.platform == RuntimePlatform.IPhonePlayer ) {
if(verbose)Debug.Log("Already got width height of WebCamTexture.");
} else {
}
gotAspect = true;
} else {
if(verbose)Debug.Log ("Taking dummy snapshot");
if( tmpImg == null ) {}
Color32[] c = webCamTexture.GetPixels32();
}
}
}
如果您不想等到报告或分配大小并且目标平台是 iOS (iPhone/iPad),也可以编写一个直接从中获取大小的插件通过扩展 CameraCapture.mm Unity 中的相机代码:
- (void)captureOutput:(AVCaptureOutput*)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection*)connection
{
intptr_t tex = (intptr_t)CMVideoSampling_SampleBuffer(&self->_cmVideoSampling, sampleBuffer, &self->_width, &self->_height);
_staticWebCamTexWidth = self->_width;
_staticWebCamTexWidth = self->_height;
UnityDidCaptureVideoFrame(tex, self->_userData);
if( self.firstFrameCallback!=nil ) {
[self fireFirstFrame];
}
}
self->width / height 可以在作为插件方法添加的方法中返回,例如:
[DllImport("__Internal")]
private static extern int GetWebCamTextureWidth ();
[DllImport("__Internal")]
private static extern int GetWebCamTextureHeight ();
然后在对象代码中
extern "C" int GetWebCamTextureWidth() { return _staticWebCamTexWidth; }
extern "C" int GetWebCamTextureHeight() { return _staticWebCamTexHeight; }
这是我为使用 unity 的 iOS 社交游戏之一提出的解决方案。在 Android 我们又回到了之前描述的方法。