应用按像素操作很慢

问题描述 投票:1回答:1
@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;
}

这是我的代码,用于更改JavaCameraView组件内显示的cameraStream的像素值。事情是这很慢。小于3 fps。我知道有更快的方法来获得灰度图像{.rgba() => .gray()或使用Improc.cvt()}。虽然我需要自由处理像素的自由。我的最终目标是得到一些我可以调整红色,绿色,蓝色的东西。

有没有办法使这至少得到30fps(平滑帧率)?

java android opencv
1个回答
1
投票

由于本机调用的开销,每个像素的获取和放置操作肯定会导致fps很差。相反,你应该只调用一次get和put操作。在for循环之外。单调用get / put将它们放入java原始数组中对它们进行操作。这样你就可以进行自己的像素操作,这将大大提高性能(更接近imgproc.cvt())。 http://answers.opencv.org/question/5/how-to-get-and-modify-the-pixel-of-mat-in-java/这将向您展示如何进行单个get / put调用的示例(不仅是实际答案,还要在注释中查看)。

© www.soinside.com 2019 - 2024. All rights reserved.