@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/