2017-08-28 70 views
1

我嘗試向ARSCNView的相機圖像添加B & W濾鏡,然後在其上渲染彩色AR對象。在SceneKit下可靠地訪問和修改捕獲的相機幀

enter image description here

我'幾乎沒有用下面的代碼添加到- (void)renderer:(id<SCNSceneRenderer>)aRenderer updateAtTime:(NSTimeInterval)time

CVPixelBufferRef bg=self.sceneView.session.currentFrame.capturedImage; 

if(bg){ 
    char* k1 = CVPixelBufferGetBaseAddressOfPlane(bg, 1); 
    if(k1){ 
     size_t x1 = CVPixelBufferGetWidthOfPlane(bg, 1); 
     size_t y1 = CVPixelBufferGetHeightOfPlane(bg, 1); 
     memset(k1, 128, x1*y1*2); 
    } 
} 

這工作真快上移動,但這裏的東西開始:有時會顯示彩色框。 我檢查了我的過濾代碼,但我認爲它太晚了,SceneKit的管道已經處理了相機輸入。

早些時候調用代碼會有所幫助,但是updateAtTime是可以通過幀代碼添加自定義幀的最早點。

獲取有關幀捕獲可能有助於通知,但看起來像整個AVCapturesession is unaccessible.

金屬ARKit例子顯示瞭如何將相機圖像轉換爲RGB,這是在那裏我會做過濾的地方,但該着色器在使用SceneKit時隱藏。我試過this possible answer但它太慢了。

那麼,我該如何克服畫面未命中,並將攝像機輸入可靠地轉換爲BW?

+0

只是一個想法,我沒有測試自己:你可以使用[shaderModifier](https://developer.apple.com/documentation/scenekit/scnshadable#1654834)將背景圖像轉換爲黑白色,方法是添加一個片段着色器? – orangenkopf

+0

如果CVPixelBuffer方法無法修復,@orangenkopf絕對是一種方法。你將shaderModifier附加到什麼? – diviaki

+0

根據['ARSCNView'](https://developer.apple.com/documentation/arkit/arscnview)文檔框架被設置爲場景['background'](https://developer.apple.com/ documentation/scenekit/scnscene/1523665-background)這是一個可以附加着色器修飾符的材質屬性。根據評論[這裏](https://stackoverflow.com/questions/45321275/how-to-place-3d-model-using-arkit-ios-11-with-some-custom-background-view-withou/ 45324663#45324663)雖然 – orangenkopf

回答

1

下面是這個問題的關鍵:

session:didUpdateFrame:

提供了一個新拍攝的攝像機圖像和相應的AR信息的委託。

所以剛搬到CVPixelBufferRef操作,從

- (void)renderer:(id<SCNSceneRenderer>)aRenderer updateAtTime:(NSTimeInterval)time 

圖像過濾代碼,以

- (void)session:(ARSession *)session didUpdateFrame:(ARFrame *)frame 

確信設置self.sceneView.session.delegate = self有這個代表呼籲。