2

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

我可能会将视频流作为输入,可能会制作它的图像并实时分析图像或流中是否存在光源(可能是图像上某种颜色的像素数?)

我该如何解决这个问题?也许有一些图书馆的来源?

4

3 回答 3

20

听起来您正在询问有关几个谨慎步骤的信息。有很多方法可以做到每一个,如果你在任何一个单独的步骤上遇到困难,最好单独发布一个关于它的问题。

1:获取视频帧

就像 chaitanya.varanasi 所说,AVFoundation Framework 是在 IOS 上访问视频帧的最佳方式。如果您想要一些不太灵活和更快的东西,请尝试查看 open CV 的视频捕获。此步骤的目标是从相机访问像素缓冲区。如果您对此有疑问,请具体询问。

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 是一个非常大的库,可以做各种各样的事情。在不了解您的问题的情况下,我不知道还能告诉您什么。

于 2012-08-01T20:48:52.997 回答
4

查看 Apple 的AVFoundation 框架

希望能帮助到你!

您可以尝试这种方法:首先将所有图像保存到AVCaptureVideoDataOutput. 从方法:captureOutput:didOutputSampleBuffer:fromConnection,您可以对每个像素进行采样/计算。来源:答案

此外,您可以查看这个SO question,他们在其中检查像素是否为黑色。如果它的光源如此强大,您可以取像素的倒数,然后确定使用设置的黑色阈值。

于 2012-07-25T18:32:54.237 回答
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);
于 2015-04-18T03:18:05.240 回答