如何检测视频中的绿屏、绿帧问题

文章介绍了在遇到视频偶发绿屏问题时,如何利用OpenCV库进行绿帧检测。通过计算图像矩形区域的RGB通道均值,当R、B通道值接近0且G通道值接近特定值(如153)时,标记为绿屏。若绿帧不“稳定”,可调整检测条件或引入标准差来提高检测准确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天给项目拷机,发现视频会偶现绿屏,非常偶现,很难复现出来。

由于问题暂时没有定位,只能先表面解决一下,就是过滤掉出现绿屏的帧。

当然,首先要把绿帧检测出来,才能做后续的补救措施。

绿屏、绿帧出现的时候,实际上就是一张全绿图像,它的R、B通道一般为0,G通道都为一个相同的值,比如我此次的:

 R、B通道像素值为0,G通道像素值全都是153;

于是我们就可以直接使用均值、标准差来检测绿帧

#include <opencv4/opencv2/highgui.hpp>
#include <opencv4/opencv2/imgproc.hpp>
#include <iostream>

int main() {
    cv::Mat mat = cv::imread("./绿屏.jpg");
    cv::Scalar  mean;
    cv::Scalar  dev;

    auto s1 = std::chrono::system_clock::now();

    mean = cv::mean(cv::Mat{mat, cv::Rect{0,0,100,100}});

    auto s2 = std::chrono::system_clock::now();
    auto dura = std::chrono::duration_cast<std::chrono::microseconds>(s2-s1);
    std::cout << dura.count() << std::endl;

    printf("%f,%f,%f\n", mean.val[0], mean.val[1], mean.val[2]);

    if ( mean.val[0] < 5 && mean.val[2] < 5 && abs(mean.val[1] - 153) < 5 )  //此处的153只针对我自己的问题
        printf("is green img\n");

    cv::imshow(" ", mat);
    cv::waitKey(10000);
}

首先解释一下cv::mean函数,它返回是三通道的均值,即R通道均值,G通道均值,B通道均值;

由于我的问题中的绿帧很稳定,我是指像素值很稳定,固定的[0,153,0],因此简单的均值就可以很好的检测出来。

如果你的绿帧没有这么“稳定”,那么可以试着放宽检测标准,比如这样:

if ( mean.val[0] < 5 && mean.val[2] < 5 && mean.val[1] > 100 )

或者也可以加上标准差,使用cv::meanStdDev函数,它的用法是:

void meanStdDev(const cv::Mat& src, cv::Scalar mean, cv::Scalar stddev);

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值