Android、OpenCv:函数内发生裁剪时裁剪失败

Android, OpenCv: crop fails when crop occurs within function

我有一个 class 可以接收用相机拍摄的帧。然后它将帧传递给相机计算器,相机计算器根据相机计算器的纵横比设置进行一些处理和裁剪。

当我有...

@Override
public void receivePicture(Mat frame) {
    mCameraCalculator.processFrameForResult(frame);
    //the image is then saved   
}

//in camera calculator...
public void processFrameForResult(Mat frame){
    processFrame(frame);
    frame = frame.submat(getCenterByAspectRatio(frame)); //crop
}

裁剪失败(未裁剪保存的图像)。然而,当我有...

@Override
public void receivePicture(Mat frame) {
    mCameraCalculator.processFrameForResult(frame);
    frame = frame.submat(mCameraCalculator.getCenterByAspectRatio(frame)); //crop
    //the image is then saved   
}

//in camera calculator...
public void processFrameForResult(Mat frame){
    processFrame(frame);
}

效果很好。这根本不符合逻辑。这两段代码不等价吗?

看来,receivePictureprocessFrameForResult是两个不同的class。在顶部代码块中,您正在 CameraCalculator class 中进行裁剪。问题出在分配Frame时的processFrameForResult方法。这行实际上并没有将裁剪后的 Frame 分配回 Frame 变量,因为一旦方法 returns,输入 Mat Frame 变量就不再在范围内。有关原因的更多详细信息,please see this post 详细介绍了按引用传递和按值传递之间的差异。

如果您希望顶部代码块起作用,那么顶部代码块中的 processFrameForResult 方法必须 return Mat Frame 对象而不是 void。