Objective c 是否有更简单的方法从iOS设备捕获字节';谁的照相机?
我正在使用iOS 5.1中的OpenCV进行一些图像处理。我有一些库来检测标记和其他东西 我现在需要做的是从相机中获取每一帧视频,这样我就可以使用OpenCV进一步处理它。我发现了一些示例代码,例如,在,但它似乎有不必要的困难。我的意思是,我真的需要写500行代码来捕获帧并将其推回到视图中吗 有人能告诉我从哪里开始吗 //更新 这是我能够编写的最简单的captureOutput:didOutputSampleBuffer:fromConnection:methodObjective c 是否有更简单的方法从iOS设备捕获字节';谁的照相机?,objective-c,ios,Objective C,Ios,我正在使用iOS 5.1中的OpenCV进行一些图像处理。我有一些库来检测标记和其他东西 我现在需要做的是从相机中获取每一帧视频,这样我就可以使用OpenCV进一步处理它。我发现了一些示例代码,例如,在,但它似乎有不必要的困难。我的意思是,我真的需要写500行代码来捕获帧并将其推回到视图中吗 有人能告诉我从哪里开始吗 //更新 这是我能够编写的最简单的captureOutput:didOutputSampleBuffer:fromConnection:method - (void)capture
- (void)captureOutput:(AVCaptureOutput *)captureOutput
didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer
fromConnection:(AVCaptureConnection *)connection {
@autoreleasepool {
CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
CVPixelBufferLockBaseAddress(imageBuffer, 0);
uint8_t *baseAddress = (uint8_t *)CVPixelBufferGetBaseAddress(imageBuffer);
CGRect videoRect = CGRectMake(0.0f, 0.0f, CVPixelBufferGetWidth(imageBuffer), CVPixelBufferGetHeight(imageBuffer));
cv::Mat mat(videoRect.size.height, videoRect.size.width, CV_8UC1, baseAddress, 0);
[self processFrame:mat videoRect:videoRect]; //which is to be implemented in subclass - which means it's gonna do something with openCV and then openGL it to view :)
mat.release();
CVPixelBufferUnlockBaseAddress(imageBuffer, 0);
}
}
如果删除注释和空白,甚至不需要50行代码。真的不太麻烦,它完全满足了你的需要。谢谢你的回复,看起来我最终还是要研究它:)坦白地说,当你想到上面链接的代码在做什么时(设置与实时摄像机的连接、配置色彩空间、设置最小帧速率和处理视频帧),这根本不是很多代码。事实上,大部分底部部分都可以删除,因为您只需要将原始图像数据字节传递给OpenCV,因此无需创建完整的UIImage。但是,请注意,由于CPU限制的图像处理例程非常慢,您可能无法实时执行所需的图像处理。谢谢您的回复。我注意到这可能不像我预期的那么容易。我简化了captureOutput:didOutputSampleBuffer:fromConnection:方法,因此不必创建CGImages等等。然后我将它传递给openCV来做一些事情,然后我将不得不使用openGLES来渲染要查看的图像(这可能是实现实时渲染的方法?)。困扰我的是,我仍然必须将CMSampleBufferRef转换为CVImageBufferRef。