Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在透明垫上绘制网格_Java_Opencv_Mat - Fatal编程技术网

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)。