Java 在透明垫上绘制网格
我想创建一个透明背景上的网格垫,我可以放在其他垫子上面。我挣扎在透明的部分,躺在上面Java 在透明垫上绘制网格,java,opencv,mat,Java,Opencv,Mat,我想创建一个透明背景上的网格垫,我可以放在其他垫子上面。我挣扎在透明的部分,躺在上面 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); 首先,网格垫不是透明的,它是黑色的。标量不是这样构造的吗
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;
}
cv::Mat input=cv::imread(“../inputData/Lenna.png”);
cv::Mat输入BGRA;
cv::cvtColor(输入、输入BGRA、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(网格实体,cv::Point(0,0),cv::Point(512512),cv::Scalar(0255,0255),10);
cv::line(网格实体,cv::Point(0512),cv::Point(512,0),cv::Scalar(0255,0255),10);
cv::line(网格掩码,cv::Point(0,0),cv::Point(512512),cv::Scalar(255),10);//单通道
cv::line(网格掩码,cv::Point(0512),cv::Point(512,0),cv::Scalar(255,10);//单通道
//复制并使用掩码。复制会消除设置掩码的原始值
cv::Mat outputCopy=inputBGRA.clone();
copyTo(outputCopy,gridMask);
//此处将标量alpha值设置为小于255
//两行使用不同的alpha值
cv::line(网格Alpha,cv::Point(0,0),cv::Point(512512),cv::Scalar(0255,0120),10);
cv::line(网格Alpha,cv::Point(0512),cv::Point(512,0),cv::Scalar(0255,0180),10);
cv::Mat outputWeightSum=inputBGRA.clone();
//cv::addWeighted(inputBGRA,0.5,gridAlpha,0.5,0,outputWeightSum);
//手动添加每个ALPHA值的加权和:
对于(int y=0;请理解,opencv主要是一个计算机视觉api,而不是一个桌面发布api,在内置操作中根本不支持alpha通道。您必须主要使用自己的api,而且java api(不知道它特别友好像素)可能是实现这一点的错误方法。创建第二个mat:mat gridMask=new Mat(image.size(),CV_8UC1,new Scalar(0);
然后在绘制网格时,在网格掩码上绘制相同的像素(白色或任何颜色)
(白色)=0)并更改为grid.copyTo(image,mask);
在您的情况下,要覆盖两个网格,您可以一个一个地相乘(当然不是矩阵相乘:)@米卡:是的,我找到了add()
。不过你的似乎要短一些。谢谢!@TomTom取决于你想做什么。如果你想合并/混合网格图像和原始图像,你需要一些加权和或其他东西。如果你想替换,你需要复制。代码中有一个小错误:结果图像的alpha通道不应该是两个输入的混合,而是m我猜它们的alpha值的最大值…否则整个像素最终将部分透明(例如,如果保存为png)。