视频处理与自适应对比度阈值均衡化(c++版)

该代码示例展示了如何使用C++和OpenCV库进行视频处理,包括读取视频帧,应用自适应对比度局部直方图均衡化(CLAHE)处理,以及矩阵的合并与拼接。CLAHE用于提高图像的对比度,视频处理部分涉及帧的读取、处理及写入新视频。此外,还介绍了VisualStudio的批量注释快捷键。
摘要由CSDN通过智能技术生成

视频处理

读取视频帧并做处理

void VideoDemo::video_demo() {

    VideoCapture cap("video/01.mp4");//读取视频文件

    int frame_width = cap.get(CAP_PROP_FRAME_WIDTH);
    int frame_height = cap.get(CAP_PROP_FRAME_HEIGHT);
    int frame_count = cap.get(CAP_PROP_FRAME_COUNT);
    double fps = cap.get(CAP_PROP_FPS);

    VideoWriter wri("result/wri.mp4", cap.get(CAP_PROP_FOURCC), fps, Size(frame_width, frame_height), true);

    Mat frame;
    while (true) {

        cap.read(frame);//frame为输出,read是将捕获到的视频一帧一帧的传入frame

        //对视频读取时,同图像一样会有判空操作
        if (frame.empty()) {
            break;
        }
        int w1 = int(frame_width);
        int halfw1 = int(w1 / 2);
        Mat orig_frame = frame.colRange(1, halfw1).clone();
        frame = clahe_deal(frame);

        Mat en_frame = frame.colRange(halfw1, w1).clone();

        Mat result(cv::Size(frame_width, frame_height), CV_32FC1);

        hconcat(orig_frame, en_frame, result);
        wri.write(result);

        namedWindow("frame", cv::WINDOW_KEEPRATIO);
        imshow("frame", result);

        int c = waitKey(1);
        if (c == 27) {
            break;
        }
    }
    cap.release();
    wri.release();
}

自适应对比度阈值均衡化

static void color_transfer_with_spilt(cv::Mat& input, std::vector<cv::Mat>& chls)
{
    cv::cvtColor(input, input, cv::COLOR_BGR2YCrCb);
    cv::split(input, chls);
}

static void color_retransfer_with_merge(cv::Mat& output, std::vector<cv::Mat>& chls)
{
    cv::merge(chls, output);
    cv::cvtColor(output, output, cv::COLOR_YCrCb2BGR);
}

cv::Mat clahe_deal(cv::Mat& src)
{
    cv::Mat ycrcb = src.clone();
    std::vector<cv::Mat> channels;

    color_transfer_with_spilt(ycrcb, channels);

    cv::Mat clahe_img;
    cv::Ptr<cv::CLAHE> clahe = cv::createCLAHE();
    clahe->setClipLimit(2.);    // (int)(4.*(8*8)/256)
    clahe->setTilesGridSize(Size(8, 8)); // 将图像分为8*8块
    clahe->apply(channels[0], clahe_img);
    channels[0].release();
    clahe_img.copyTo(channels[0]);
    color_retransfer_with_merge(ycrcb, channels);
    return ycrcb;
}

其他操作

矩阵的合并与拼接

int w1 = int(frame_width);
int halfw1 = int(w1 / 2);
//读取矩阵1-halfw1列的数据
Mat orig_frame = frame.colRange(1, halfw1).clone();
Mat en_frame = frame.colRange(halfw1, w1).clone();
//创建新的矩阵作为合并后的矩阵,定义矩阵时先列后行
//CV_32FC1
Mat result(cv::Size(frame_width, frame_height), CV_32FC1);
//按列合并矩阵
hconcat(orig_frame, en_frame, result);

visual studio注释

  • 批量注释

    先按:Ctrl + K
    再按:Ctrl + C

  • 批量取消注释

    先按:Ctrl + K
    再按:Ctrl + U

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值