首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何分析iOS上的视频流?

如何分析iOS上的视频流?
EN

Stack Overflow用户
提问于 2012-07-26 01:44:37
回答 3查看 3.6K关注 0票数 2

例如,QR扫描仪可以实时扫描视频流,并获得二维码信息。我想检查视频中的光源,如果它是开或关,它是相当强大的,所以它是没有问题的。

我可能会将视频流作为输入,可能会对其进行图像处理,并实时分析图像或视频流中是否存在光源(可能图像上有多少特定颜色的像素?)

我该如何解决这个问题?也许有一些库的源码?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-08-02 04:48:53

听起来你是在询问有关几个谨慎步骤的信息。有很多方法可以做到这一点,如果你在任何一个单独的步骤中遇到困难,单独发布一个问题将是一个好主意。

1:获取视频帧

正如chaitanya.varanasi所说,AVFoundation框架是在IOS上访问视频帧的最佳方式。如果你想要一些不太灵活和更快的东西,可以试试开放式简历的video capture。此步骤的目标是从相机访问像素缓冲区。如果你在这方面有问题,请具体询问。

2:将像素缓冲区放入OpenCV

这部分真的很简单。如果你从openCV的视频捕获中得到它,那么你已经完成了。如果您从AVFoundation获取它,则需要将其放入openCV中,如下所示

代码语言:javascript
复制
//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是一个非常大的库,可以做各种各样的事情。如果不知道更多关于你的问题,我不知道还能告诉你什么。

票数 20
EN

Stack Overflow用户

发布于 2012-07-26 02:32:54

看看苹果的AVFoundation Framework吧。

希望它能帮上忙!

您可以尝试此方法:首先将所有图像转换为AVCaptureVideoDataOutput。通过方法:captureOutput:didOutputSampleBuffer:fromConnection,您可以对每个像素进行采样/计算。来源:answer

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

票数 4
EN

Stack Overflow用户

发布于 2015-04-18 11:18:05

上面的示例代码仅提供对存储在缓冲区中的像素值的访问;您不能运行任何其他命令,只能运行那些逐个像素更改这些值的命令:

代码语言:javascript
复制
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;
    }
}

这--举个例子来说--将不适用于您提供的代码:

代码语言:javascript
复制
    cv::Mat bgraImage = cv::Mat( (int)height, (int)extendedWidth, CV_8UC4, base );
cv::Mat grey = bgraImage.clone();
cv::cvtColor(grey, grey, 44);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11655545

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档