Java 如何使用CvCameraViewListener快速访问每个帧的像素颜色

Java 如何使用CvCameraViewListener快速访问每个帧的像素颜色,java,android,opencv,camera,pixels,Java,Android,Opencv,Camera,Pixels,我想写一个简单的Android OpenCV应用程序,它获取每个相机帧,并对帧的像素进行一些计算。我正在使用下面的代码。问题是速度太慢了 public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame) { mRgba = inputFrame.rgba(); for(int u = 0; u < frame_width; u++) { for (int v

我想写一个简单的Android OpenCV应用程序,它获取每个相机帧,并对帧的像素进行一些计算。我正在使用下面的代码。问题是速度太慢了

    public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame) {
    mRgba = inputFrame.rgba();
        for(int u = 0; u < frame_width; u++) {
        for (int v = 0; v < frame_height; v++) {
            double[] current_color = mRgba.get(v, u);
            current_color[0] = current_color[0]/2;
            mRgba.put(v,u, current_color);
        }
    }
    return mRgba;
所以我假设慢度是由访问每个像素引起的。我的手机是1024*768像素。不幸的是,我需要访问每个单独的像素,我的逻辑才能工作。是否有更快的方法访问和修改每个像素

谢谢,您正在对图像的列进行迭代。由于缓存未命中,您的图像足够大,因此速度非常慢。一列中每两个连续像素实际上是内存中彼此相距的扫描宽度像素。而是通过交换循环的顺序来迭代行。从这个优化开始,您可能会惊讶于它的速度有多快

2) 不要使用
mRgba。在循环中获取(u,v)
。我不使用java中的OpenCV,但是C++中,我会得到一个指向每行开始的指针,并在每行中顺序地对像素进行操作。在Java中,您可以创建一个
double[]
缓冲区来缓冲行的大小,并使用
intget(introw,intcol,double[]data)
一次获取整行数据。类似地,对于
put
函数。我不知道如何在Java中访问底层数据缓冲区(即:不复制)。如果你知道怎么做,让我知道

3) 在完成1和2之后,如果您想让它更快,并且您可以访问多个内核,那么您可以并行执行行操作。我不能就如何在Java中实现这一点向您提供建议,但也许其他人可以,或者您可以查看文档

我对你的结果很感兴趣,如果可以的话,请向我汇报。谢谢。

可能相关:
public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame) {
mRgba = inputFrame.rgba();
Mat imgCanny = new Mat(height,width,CvType.CV_8UC1);
Imgproc.Canny(mRgba,imgCanny,50,150);
return imgCanny;
}