例如,有QR扫描仪可以实时扫描视频流并获取QR码信息。 我想检查视频中的光源,如果它是开启或关闭,它是相当强大的,所以它没有问题。如何分析iOS上的视频流?
我可能会采取视频流作为输入,也许是为了它的图像和实时分析图像或流为光源的存在(也许编号的图像上的某些颜色的像素?)
如何我是否会解决这个问题?也许有一些图书馆的来源?
例如,有QR扫描仪可以实时扫描视频流并获取QR码信息。 我想检查视频中的光源,如果它是开启或关闭,它是相当强大的,所以它没有问题。如何分析iOS上的视频流?
我可能会采取视频流作为输入,也许是为了它的图像和实时分析图像或流为光源的存在(也许编号的图像上的某些颜色的像素?)
如何我是否会解决这个问题?也许有一些图书馆的来源?
这听起来像你在询问关于几个谨慎步骤的信息。有很多种方法可以完成每个步骤,如果您遇到任何单独的步骤,最好单独发布一个关于它的问题。
1:获取视频帧
像chaitanya.varanasi说,AVFoundation框架是获得访问IOS上的视频帧的最佳途径。如果你想要更少的灵活性和更快速的尝试查看公开简历的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是一个非常大的库,可以处理各种各样的事情。不知道更多关于你的问题,我不知道还有什么要告诉你。
看看苹果的AVFoundation Framework。
希望它有帮助!
你可以尝试这种方法:首先让所有图像到AVCaptureVideoDataOutput
。从方法:captureOutput:didOutputSampleBuffer:fromConnection
,您可以采样/计算每个像素。来源:answer
另外,你可以看看这个SO question他们检查一个像素是否是黑色的。如果它具有如此强大的光源,则可以取像素的倒数,然后使用设定的黑色阈值来确定。
上述示例代码仅提供对存储在缓冲区中的像素值的访问;你不能运行任何其他命令,但那些改变逐像素的基础上的价值观:
cv::Mat bgraImage = cv::Mat((int)height, (int)extendedWidth, CV_8UC4, base);
cv::Mat grey = bgraImage.clone();
cv::cvtColor(grey, grey, 44);
:
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;
}
}
这对使用你的榜样,不会跟你提供的代码工作