例如,有 QR 扫描仪可以实时扫描视频流并获取 QR 码信息。我想检查视频中的光源,如果它是打开或关闭的,它非常强大,所以没问题。
我可能会将视频流作为输入,可能会制作它的图像并实时分析图像或流中是否存在光源(可能是图像上某种颜色的像素数?)
我该如何解决这个问题?也许有一些图书馆的来源?
例如,有 QR 扫描仪可以实时扫描视频流并获取 QR 码信息。我想检查视频中的光源,如果它是打开或关闭的,它非常强大,所以没问题。
我可能会将视频流作为输入,可能会制作它的图像并实时分析图像或流中是否存在光源(可能是图像上某种颜色的像素数?)
我该如何解决这个问题?也许有一些图书馆的来源?
听起来您正在询问有关几个谨慎步骤的信息。有很多方法可以做到每一个,如果你在任何一个单独的步骤上遇到困难,最好单独发布一个关于它的问题。
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 是一个非常大的库,可以做各种各样的事情。在不了解您的问题的情况下,我不知道还能告诉您什么。
查看 Apple 的AVFoundation 框架。
希望能帮助到你!
您可以尝试这种方法:首先将所有图像保存到AVCaptureVideoDataOutput
. 从方法:captureOutput:didOutputSampleBuffer:fromConnection
,您可以对每个像素进行采样/计算。来源:答案
此外,您可以查看这个SO question,他们在其中检查像素是否为黑色。如果它的光源如此强大,您可以取像素的倒数,然后确定使用设置的黑色阈值。
上面的示例代码只提供了对存储在缓冲区中的像素值的访问;除了逐像素更改这些值的命令外,您不能运行任何其他命令:
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);