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);
}
效果很好。这根本不符合逻辑。这两段代码不等价吗?
看来,receivePicture
和processFrameForResult
是两个不同的class。在顶部代码块中,您正在 CameraCalculator
class 中进行裁剪。问题出在分配Frame
时的processFrameForResult
方法。这行实际上并没有将裁剪后的 Frame
分配回 Frame
变量,因为一旦方法 returns,输入 Mat Frame
变量就不再在范围内。有关原因的更多详细信息,please see this post 详细介绍了按引用传递和按值传递之间的差异。
如果您希望顶部代码块起作用,那么顶部代码块中的 processFrameForResult
方法必须 return Mat Frame
对象而不是 void。
我有一个 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);
}
效果很好。这根本不符合逻辑。这两段代码不等价吗?
看来,receivePicture
和processFrameForResult
是两个不同的class。在顶部代码块中,您正在 CameraCalculator
class 中进行裁剪。问题出在分配Frame
时的processFrameForResult
方法。这行实际上并没有将裁剪后的 Frame
分配回 Frame
变量,因为一旦方法 returns,输入 Mat Frame
变量就不再在范围内。有关原因的更多详细信息,please see this post 详细介绍了按引用传递和按值传递之间的差异。
如果您希望顶部代码块起作用,那么顶部代码块中的 processFrameForResult
方法必须 return Mat Frame
对象而不是 void。