gpt4 book ai didi

android - 离散傅里叶变换 OpenCV 不适用于 Android

转载 作者:太空宇宙 更新时间:2023-11-03 23:09:03 25 4
gpt4 key购买 nike

我正在尝试在 Android 上转换和显示使用 Core.dft() 制作的图像,但它在我调用 Core.dft() 的那一行一直崩溃。

这是我的代码:

private Mat getDFT(Mat singleChannel) {

singleChannel.convertTo(singleChannel, CvType.CV_64FC1);

int m = Core.getOptimalDFTSize(singleChannel.rows());
int n = Core.getOptimalDFTSize(singleChannel.cols()); // on the border
// add zero
// values
// Imgproc.copyMakeBorder(image1,
// padded, 0, m -
// image1.rows(), 0, n

Mat padded = new Mat(new Size(n, m), CvType.CV_64FC1); // expand input
// image to
// optimal size

Core.copyMakeBorder(singleChannel, padded, 0, m - singleChannel.rows(), 0,
n - singleChannel.cols(), Core.BORDER_CONSTANT);

List<Mat> planes = new ArrayList<Mat>();
planes.add(padded);
planes.add(Mat.zeros(padded.rows(), padded.cols(), CvType.CV_64FC1));

Mat complexI = Mat.zeros(padded.rows(), padded.cols(), CvType.CV_64FC2);

Mat complexI2 = Mat
.zeros(padded.rows(), padded.cols(), CvType.CV_64FC2);

Core.merge(planes, complexI); // Add to the expanded another plane with
// zeros

Core.dct(complexI, complexI2); // this way the result may fit in the
// source matrix

// compute the magnitude and switch to logarithmic scale
// => log(1 + sqrt(Re(DFT(I))^2 + Im(DFT(I))^2))
Core.split(complexI2, planes); // planes[0] = Re(DFT(I), planes[1] =
// Im(DFT(I))

Mat mag = new Mat(planes.get(0).size(), planes.get(0).type());

Core.magnitude(planes.get(0), planes.get(1), mag);// planes[0]
// =
// magnitude

Mat magI = mag;
Mat magI2 = new Mat(magI.size(), magI.type());
Mat magI3 = new Mat(magI.size(), magI.type());
Mat magI4 = new Mat(magI.size(), magI.type());
Mat magI5 = new Mat(magI.size(), magI.type());

Core.add(magI, Mat.ones(padded.rows(), padded.cols(), CvType.CV_64FC1),
magI2); // switch to logarithmic scale
Core.log(magI2, magI3);

Mat crop = new Mat(magI3, new Rect(0, 0, magI3.cols() & -2,
magI3.rows() & -2));

magI4 = crop.clone();

// rearrange the quadrants of Fourier image so that the origin is at the
// image center
int cx = magI4.cols() / 2;
int cy = magI4.rows() / 2;

Rect q0Rect = new Rect(0, 0, cx, cy);
Rect q1Rect = new Rect(cx, 0, cx, cy);
Rect q2Rect = new Rect(0, cy, cx, cy);
Rect q3Rect = new Rect(cx, cy, cx, cy);

Mat q0 = new Mat(magI4, q0Rect); // Top-Left - Create a ROI per quadrant
Mat q1 = new Mat(magI4, q1Rect); // Top-Right
Mat q2 = new Mat(magI4, q2Rect); // Bottom-Left
Mat q3 = new Mat(magI4, q3Rect); // Bottom-Right

Mat tmp = new Mat(); // swap quadrants (Top-Left with Bottom-Right)
q0.copyTo(tmp);
q3.copyTo(q0);
tmp.copyTo(q3);

q1.copyTo(tmp); // swap quadrant (Top-Right with Bottom-Left)
q2.copyTo(q1);
tmp.copyTo(q2);

Core.normalize(magI4, magI5, 0, 255, Core.NORM_MINMAX);

Mat realResult = new Mat(magI5.size(), CvType.CV_8UC1);

magI5.convertTo(realResult, CvType.CV_8UC1);

return realResult;
}

我采用了 here 的形式.

Android Studio 抛出的错误是:

Caused by: CvException [org.opencv.core.CvException: cv::Exception: OpenCV(3.4.1) /build/master_pack-android/opencv/modules/core/src/dxt.cpp:3335: error: (-215) type == (((5) & ((1 << 3) - 1)) + (((1)-1) << 3)) || type == (((5) & ((1 << 3) - 1)) + (((2)-1) << 3)) || type == (((6) & ((1 << 3) - 1)) + (((1)-1) << 3)) || type == (((6) & ((1 << 3) - 1)) + (((2)-1) << 3)) in function void cv::dft(cv::InputArray, cv::OutputArray, int, int)

我调用了 getDFT(mat);来自:

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode,resultCode,data);
if (resultCode == RESULT_OK){
path = data.getData();
foto.setImageURI(path);
try {
Bitmap bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), path);
Mat mat = new Mat();
Bitmap bitmap1 = bitmap.copy(Bitmap.Config.ARGB_8888, true);
Utils.bitmapToMat(bitmap1, mat);
getDFT(mat);
Utils.matToBitmap(mat, bitmap);
fourier.setImageBitmap(bitmap);
} catch (IOException e) {
e.printStackTrace();
}

}
}

这是调用自:

boton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
intent.setType("image/");
startActivityForResult(intent.createChooser(intent,"Selecciona la aplicación"),10);
}
});

我还尝试了来自 here 的一些代码

但什么也没发生。

我正在使用 OpenCv 3.4.1 和 Android Studio 3.2.1

有什么建议吗?

最佳答案

我用你的代码通过更改行来实时实现相机预览的dft
Core.dct(complexI, complexI2);Core.dft(complexI, complexI2);

关于android - 离散傅里叶变换 OpenCV 不适用于 Android,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53586645/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com