gpt4 book ai didi

java - 在透明垫上绘制网格

转载 作者:行者123 更新时间:2023-12-02 05:05:50 24 4
gpt4 key购买 nike

我想在透明背景上创建一个带有网格的垫子,我可以将其放在其他垫子上。我挣扎于透明部分并放在上面

Mat image = imread("pic.jpg");
Mat grid = new Mat(image.size(), CV_8UC4, new Scalar(0, 0, 0, 0);

for (//times)
// draw grid with: line(grid, ... )

grid.copyTo(image);

首先,网格垫根本不透明,它是黑色的。标量不就是这样构造的吗?

new Scalar(Blue, Green, Red, Alpha)

另外,如何将一张图像与另一张图像重叠?这只是覆盖。

最佳答案

这是用 C++ 编写的示例程序,但它应该与 Java 非常相似:

    cv::Mat input = cv::imread("../inputData/Lenna.png");

cv::Mat inputBGRA;
cv::cvtColor(input, inputBGRA, CV_BGR2BGRA);

cv::Mat gridSolid = cv::Mat(input.size(), inputBGRA.type(), cv::Scalar(0,0,0,0));
cv::Mat gridMask = cv::Mat(input.size(), CV_8UC1, cv::Scalar(0));

cv::Mat gridAlpha = cv::Mat(input.size(), inputBGRA.type(), cv::Scalar(0,0,0,0));


cv::line(gridSolid, cv::Point(0,0), cv::Point(512,512), cv::Scalar(0,255,0,255), 10);
cv::line(gridSolid, cv::Point(0,512), cv::Point(512,0), cv::Scalar(0,255,0,255), 10);
cv::line(gridMask, cv::Point(0,0), cv::Point(512,512), cv::Scalar(255), 10); // single channel
cv::line(gridMask, cv::Point(0,512), cv::Point(512,0), cv::Scalar(255), 10); // single channel

// copy and use the mask. copying eliminates the original values where the mask is set
cv::Mat outputCopy = inputBGRA.clone();
gridSolid.copyTo(outputCopy,gridMask);



// here set the scalar alpha value to less than 255
// both lines use different alpha values
cv::line(gridAlpha, cv::Point(0,0), cv::Point(512,512), cv::Scalar(0,255,0,120), 10);
cv::line(gridAlpha, cv::Point(0,512), cv::Point(512,0), cv::Scalar(0,255,0,180), 10);

cv::Mat outputWeightSum = inputBGRA.clone();
//cv::addWeighted(inputBGRA, 0.5, gridAlpha, 0.5, 0, outputWeightSum);

// manually add weighted sum PER ALPHA VALUE:
for(int y=0; y<outputWeightSum.rows; ++y)
for(int x=0; x<outputWeightSum.cols; ++x)
{
// the bigger the alpha value, the less of the original image is kept at that pixel
cv::Vec4b imgPix = outputWeightSum.at<cv::Vec4b>(y,x);
cv::Vec4b gridPix = gridAlpha.at<cv::Vec4b>(y,x);

// use alpha channel vor blending
float blendpart = (float)gridPix[3]/(float)255;

// set pixel value to blended value
outputWeightSum.at<cv::Vec4b>(y,x) = blendpart * gridPix + (1.0f-blendpart) * imgPix;
}

事实上,在此示例中您不需要 Alpha channel ,但如果您有更复杂的具有不同 Alpha 值的“网格”,那可能会很好。

我得到这些结果:

  1. 方法:复制:

enter image description here

  • 方法:与 Alpha channel 混合:
  • enter image description here

    关于java - 在透明垫上绘制网格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27807255/

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