java - 应用像素级操作很慢

标签 java android opencv

@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 帧/秒。我知道有一种更快的方法来获取灰度图像 {.rgba() => .gray() 或使用 Improc.cvt()}。虽然我需要自己处理像素的自由。我的最终目标是得到一些我可以随意调整红色、绿色、蓝色的东西。

有没有办法让它至少达到 30fps(平滑的帧率)?

最佳答案

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

关于java - 应用像素级操作很慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47986588/

相关文章:

java - IntelliJ 2016.3 GAE 部署 Java8/7

java - 内存不足时是否运行 Java GC?

android - 某些值在 MPAndroidChart 中不可见?

android - 调用后如何恢复exoplayer

linux - 逐帧更改相机曝光

java - 在Java中使用TensorFlow的Python Tensor

java - 写入文件的最有效方法?

android - 根据UUID退订用户

c++ - VS 2008 中的奇怪链接错误

c++ - Opencv 异常 fillconvexppoly