如何在iOS上分析视频流?

时间:2012-07-25 17:44:37

标签: objective-c ios video opencv video-processing

例如,有些QR扫描仪可以实时扫描视频流并获取QR码信息。 我想检查视频中的光源,如果它打开或关闭,它是非常强大的,所以它没有问题。

我可能会将视频流作为输入,可能会制作图像并分析图像或实时流式传输光源(可能是图像上某些颜色的像素数?)

如何解决此问题?也许有一些图书馆的来源?

3 个答案:

答案 0 :(得分:19)

听起来您要求提供有关几个谨慎步骤的信息。有很多种方法可以做到这些,如果你遇到任何一个步骤,最好单独发一个问题。

1:获取视频帧

像chaitanya.varanasi所说,AVFoundation Framework是在IOS上访问视频帧的最佳方式。如果你想要一些不那么灵活和快速的东西,试着看看开放的CV video capture。此步骤的目标是从相机访问像素缓冲区。如果您遇到此问题,请特别询问。

2:将像素缓冲区放入OpenCV

这部分非常简单。如果你从openCV的视频捕获中获得它,你已经完成了。如果你从AVFoundation获得它,你需要将它放入openCV,就像这样

//Buffer is of type CVImageBufferRef, which is what AVFoundation should be giving you
//I assume it is BGRA or RGBA formatted, if it isn't, change CV_8UC4 to the appropriate format

CVPixelBufferLockBaseAddress( Buffer, 0 );

int bufferWidth = CVPixelBufferGetWidth(Buffer);
int bufferHeight = CVPixelBufferGetHeight(Buffer);

unsigned char *pixel = (unsigned char *)CVPixelBufferGetBaseAddress(Buffer);
cv::Mat image = cv::Mat(bufferHeight,bufferWidth,CV_8UC4,pixel); //put buffer in open cv, no memory copied

//Process image Here

//End processing
CVPixelBufferUnlockBaseAddress( pixelBuffer, 0 );

注意我假设您计划在OpenCV中执行此操作,因为您使用了它的标记。另外我假设您可以将OpenCV框架链接到您的项目。如果这是一个问题,请询问有关它的具体问题。

3:处理图片

这部分是迄今为止最开放的部分。你所说的关于你的问题的一切都是你试图检测一个强大的光源。一种非常快速简便的方法是检测灰度图像中的平均像素值。如果您获得彩色图像,则可以使用cvtColor进行转换。然后只需在其上调用Avg即可获得平均值。希望你可以通过该值的波动来判断灯是否亮起。

chaitanya.varanasi提出了另一种选择,你也应该检查一下。

openCV是一个非常大的库,可以执行各种各样的事情。如果不了解您的问题,我不知道还能告诉您什么。

答案 1 :(得分:4)

查看Apple的AVFoundation Framework

希望它有所帮助!

您可以尝试此方法:首先将所有图片都设为AVCaptureVideoDataOutput。从方法:captureOutput:didOutputSampleBuffer:fromConnection,您可以采样/计算每个像素。资料来源:answer

另外,您可以查看此SO question,检查像素是否为黑色。如果它是如此强大的光源,你可以采用像素的倒数,然后使用设定的黑色阈值来确定。

答案 2 :(得分:0)

以上示例代码仅提供对存储在缓冲区中的像素值的访问;你不能运行任何其他命令,而是那些在逐个像素的基础上改变这些值的命令:

for ( uint32_t y = 0; y < height; y++ )
{
    for ( uint32_t x = 0; x < width; x++ )
    {
        bgraImage.at<cv::Vec<uint8_t,4> >(y,x)[1] = 0;
    }
}

这 - 使用您的示例 - 将无法使用您提供的代码:

    cv::Mat bgraImage = cv::Mat( (int)height, (int)extendedWidth, CV_8UC4, base );
cv::Mat grey = bgraImage.clone();
cv::cvtColor(grey, grey, 44);