Java 应用逐像素操作很慢 @覆盖 CameraFrame上的公用Mat(CameraBridgeViewBase.CvCameraViewFrame inputFrame){ Mat rgb=inputFrame.rgba(); 对于(int y=0;y

Java 应用逐像素操作很慢 @覆盖 CameraFrame上的公用Mat(CameraBridgeViewBase.CvCameraViewFrame inputFrame){ Mat rgb=inputFrame.rgba(); 对于(int y=0;y,java,android,opencv,Java,Android,Opencv,由于本机调用的开销,每个像素的Get和put操作肯定会导致较差的fps。相反,您应该只调用一次Get和put操作。也就是说,在for循环之外。单次调用将它们获取/放入java基元数组并对其执行操作。这样,您可以执行自己的像素操作,这将提高性能性能大大提高(更接近imgproc.cvt()。 这将向您展示一个如何进行单个get/put调用的示例(不仅是实际答案,还可以在注释中看到)。它现在正在工作。下一件事是关于字节[]。因此,让我们认为我需要删除所有红色值并替换为绿色值。我如何实现for循环..

由于本机调用的开销,每个像素的Get和put操作肯定会导致较差的fps。相反,您应该只调用一次Get和put操作。也就是说,在for循环之外。单次调用将它们获取/放入java基元数组并对其执行操作。这样,您可以执行自己的像素操作,这将提高性能性能大大提高(更接近imgproc.cvt()。
这将向您展示一个如何进行单个get/put调用的示例(不仅是实际答案,还可以在注释中看到)。

它现在正在工作。下一件事是关于字节[]。因此,让我们认为我需要删除所有红色值并替换为绿色值。我如何实现for循环..可以这样做吗???for(inti=0;iyou将获得BGR格式的值,即{B,G,R,B,G,R…等等}。您的for循环必须跳过蓝色通道以交换R和G通道。考虑一下逻辑。我可以给您一个,但如果您可以自己做的话,您可能会很高兴。小心使用字节数组。查看此链接。我可以知道如何从JavaCameraView捕获帧以将其保存为视频。我参考了opencv文档,但没有找到任何答案…我需要捕获被操纵的帧。是字节[]={B,G,R,B,G,R}还是{R,G,B,A,R,G,B,A}类正在实现cvviewliasterener2接口。我不知道我从未尝试过的视频录制。Opencv颜色格式是BGR(如果存在alpha),它应该是BGRA。这是使用imread从存储器加载图像时的一般情况。由于您的情况是实时馈送数据,它可以基于java接口的RGB或RGBA。因此,请使用imwri保存帧te了解像素格式RGB或BGR。
@Override
public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame) {

    Mat rgb=inputFrame.rgba();
    for(int y=0;y<rgb.cols();++y){
        for(int x=0;x<rgb.rows();++x){
            double[]pixelValues=rgb.get(x,y);
            double redVal=pixelValues[0];
            double greenVal=pixelValues[1];
            double blueVal=pixelValues[2];
            double alphaVal=pixelValues[3];
            double gryVal=(redVal+greenVal+blueVal)/3;
            rgb.put(x,y,gryVal,gryVal,gryVal,alphaVal);
        }
    }
    return rgb;
}