gpt4 book ai didi

c++ - 在 OpenCV 中设置透明度不起作用

转载 作者:太空宇宙 更新时间:2023-11-03 22:32:50 26 4
gpt4 key购买 nike

我正在为这样的四 channel Mat 设置透明度(基于一些计算)。但是当我在窗口上显示图像时,图像没有发生任何变化。任何帮助都会是一个很大的支持。

void feather_touch(Rect enclosingRect, Mat frame){

Point center(frame.size().width * 0.5, frame.size().height * 0.5);
int inclussive_circle_radius = (sqrt((frame.cols * frame.cols + frame.rows * frame.rows))) / 2;
for(int i = 0; i < frame.rows; i++){
for(int j = 0; j < frame.cols; j++){
Point point(i, j);
if(!inRect(point, enclosingRect)){
Vec4b channels = frame.at<Vec4b>(i, j);
int dx = center.x - point.x;
int dy = center.y - point.y;
int dist = sqrt((dx * dx) + (dy * dy));
float alpha = (float)dist/(float)inclussive_circle_radius;
int a = (int)((1 - alpha) * 255);
frame.at<Vec4b>(i, j)[3] = a;
}
}
}
}


bool inRect(cv::Point p,Rect rect) {
return p.x >= rect.x && p.x <= (rect.x + rect.width) && p.y >= rect.y && p.y <= (rect.y + rect.height);
}

最佳答案

不过我得到了答案:OpenCV 中的 imshow 不支持透明度。
我用 addWeighted 功能替换了它。现在我的函数看起来像这样:

float alpha = ((float)dist/(float)inclussive_circle_radius);
//int a = (int)((1 - alpha) * 255);
//frame.at<Vec4b>(i, j)[3] = a;
Rect rect(j, i, 1, 1);
Mat mat = frame(rect);
Mat sub = layer(rect);

if(dist > (enclosingRect.width*0.5)){
addWeighted(mat, alpha, sub, 1 - alpha, 0, mat);
mat.copyTo(frame(rect));
}else{
sub.copyTo(frame(rect));
}

关于c++ - 在 OpenCV 中设置透明度不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17765334/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com