我需要在实时摄像头画面上绘制透明图像。下面是要显示为叠加在相机源上的 png 文件。
下面是一段代码,用于从相机获取帧并将其显示在屏幕上。我也尝试将圆圈绘制为叠加层,但圆圈不透明。我认为下面的代码有误或遗漏了什么?
#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/