opencv - 如何在 opencv 中通过实时摄像头提要绘制透明图像

标签 opencv image-processing computer-vision

我需要在实时摄像头画面上绘制透明图像。下面是要显示为叠加在相机源上的 png 文件。

Circle image as overlay over the camera window

下面是一段代码,用于从相机获取帧并将其显示在屏幕上。我也尝试将圆圈绘制为叠加层,但圆圈不透明。我认为下面的代码有误或遗漏了什么?

#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>
#include <stdio.h>
#include <stdlib.h>

using namespace cv;
using namespace std;

int main () {

 Mat src;
 Mat overlay = imread ( "circle.png", -1 );

 VideoCapture cap ( 0 );

 while ( 1 ) {

 cap >> src;
 cvtColor( src, src, CV_BGR2BGRA );
 overlay.copyTo( src.colRange(0,400).rowRange(0,400));
 imshow ( "src",src );
 waitKey( 10 );

 }

 return 0;
 }

最佳答案

如果你的叠加图像有一个 alpha channel (假设图像大小相同)你可以做类似的事情

cv::Mat display_img( src.size(), src.type() );
for (int y = 0; y < src.rows; y++)
{
    const cv::Vec3b* src_pixel = src.ptr<cv::Vec3b>(y);
    const cv::Vec4b* ovl_pixel = overlay.ptr<cv::Vec4b>(y);
    cv::Vec3b* dst_pixel = display_img.ptr<cv::Vec3b>(y);
    for (int x = 0; x < src.cols; x++, ++src_pixel, ++ovl_pixel, ++dst_pixel)
    {
        double alpha = (*ovl_pixel).val[3] / 255.0;
        for (int c = 0; c < 3; c++)
        {
            (*dst_pixel).val[c] = (uchar) ((*ovl_pixel).val[c] * alpha + (*src_pixel).val[c] * (1.0 -alpha));
        }
    }
}

关于opencv - 如何在 opencv 中通过实时摄像头提要绘制透明图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20957433/

相关文章:

c++ - 带有 OpenCV 的 Qt Creator 中的错误代码 0xc0000135

opencv - gocv : how to cut out an image from blue background using opencv

python - 如何使用Intel RealSense D435创建高度图

java - 使用Buffered Image写入RGB图像

android - 使用 OpenCV 检测台球

python - SJ4000 + OpenCV + Raspberry Pi 图像处理

android - 如何在Android的OpenCV中优化我的算法?

java - 如何强制invalidate()?

image - CIELAB 颜色空间中图像中每个超像素的平均颜色

python - tf.compat.v1.random_normal() 中 random_normal 的平均值和标准差是什么意思?