OpenCV Java/C++ FourierFastTransferShift(fftshift) 푸리에 변환 후 위치 재설정 함수 (Matlab - fftshift) - (2)
I posted circShift method(below) what i coded few days ago, but it's new code using OpenCV core function a lot. Reference ( Here )
Performance that i coded this time is kinda better than the last one. But i just tested really small size matrix, so idk well. Anyway, both worked well
이전 (1)번 글의 코드는 직접 만들어서 썼던 fftshift 함수이고, 이건 opencv rect 사이즈를 잘라다가 붙여넣는 방법으로 core 함수가 더 많이 쓰인 함수이다. 참고 출처는 ( 여기 )
전에 만든 코드는 아래에
성능 자체는 이번에 쓴 코드가 살짝 빠른 것 같다. 너무 작은 matrix로 테스트를 해서 몇 밀리세컨 밖에 차이가 안났지만, 사이즈가 커지면 퍼포먼스 차이도 커지지 않을까 싶음.
아무튼.. 코드를 보자
Lemme see code..
/**
* FFT Shift core 2
* firstQuadrant to thirdQuadrant, secondQuadrant to fourthQuadrant
* thirdQuadrant to firstQuadrant, fourthQuadrant to secondQuadrant
*
* @param in
* @param out
*/
private static void circShift2(Mat in) {
// in = in.submat(new Rect(0, 0, in.cols() & -2, in.rows() & -2));
int cx = in.cols() / 2;
int cy = in.rows() / 2;
Mat q0 = new Mat(in, new Rect(0, 0, cx, cy));
Mat q1 = new Mat(in, new Rect(cx, 0, cx, cy));
Mat q2 = new Mat(in, new Rect(0, cy, cx, cy));
Mat q3 = new Mat(in, new Rect(cx, cy, cx, cy));
Mat tmp = new Mat();
q0.copyTo(tmp);
q3.copyTo(q0);
tmp.copyTo(q3);
q1.copyTo(tmp);
q2.copyTo(q1);
tmp.copyTo(q2);
}
//Main function example /////////////////////////////////////////////////////////////////////////////
public static void main(String args[]) {
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
// int sizeSet = 2;
int sizeSet = 4;
// int sizeSet = 3;
//Test magic number (2), (4), (3)
Mat inputMat = Mat.zeros(sizeSet, sizeSet, CvType.CV_32F);
// inputMat.put(0, 0, 1);
// inputMat.put(0, 1, 3);
// inputMat.put(1, 0, 4);
// inputMat.put(1, 1, 2);
inputMat.put(0, 0, 16);
inputMat.put(0, 1, 2);
inputMat.put(0, 2, 3);
inputMat.put(0, 3, 13);
inputMat.put(1, 0, 5);
inputMat.put(1, 1, 11);
inputMat.put(1, 2, 10);
inputMat.put(1, 3, 8);
inputMat.put(2, 0, 9);
inputMat.put(2, 1, 7);
inputMat.put(2, 2, 6);
inputMat.put(2, 3, 12);
inputMat.put(3, 0, 4);
inputMat.put(3, 1, 14);
inputMat.put(3, 2, 15);
inputMat.put(3, 3, 1);
//// inputMat.put(0, 0, 8);
//// inputMat.put(0, 1, 1);
//// inputMat.put(0, 2, 6);
//// inputMat.put(1, 0, 3);
//// inputMat.put(1, 1, 5);
//// inputMat.put(1, 2, 7);
//// inputMat.put(2, 0, 4);
//// inputMat.put(2, 1, 9);
//// inputMat.put(2, 2, 2);
//
//
// Mat outputMat = Mat.zeros(sizeSet, sizeSet, CvType.CV_32F);
long time = System.currentTimeMillis();
Mat outputMat = CoreFpmImg.fft2NFftShift(inputMat);
for (int i = 0; i < outputMat.rows(); ++i)
{
for (int j = 0; j < outputMat.cols(); ++j)
{
System.out.print(outputMat.get(i, j)[0] + " ");
}
System.out.println("");
}
System.out.println(outputMat.channels());
inputMat = CoreFpmImg.ifftShiftNIfft2(outputMat);
System.out.println(inputMat.channels());
for (int i = 0; i < inputMat.rows(); ++i)
{
for (int j = 0; j < inputMat.cols(); ++j)
{
System.out.print(inputMat.get(i, j)[0] + " ");
}
System.out.println("");
}
System.out.println(System.currentTimeMillis() - time);
// Core.dft(inputMat, outputMat, Core.DFT_COMPLEX_OUTPUT, 0);
// for (int i = 0; i < outputMat.rows(); ++i)
// {
// for (int j = 0; j < outputMat.cols(); ++j)
// {
// System.out.print(outputMat.get(i, j)[1] + " ");
// }
// System.out.println("");
// }
// System.out.println("");
// System.out.println("outputMat dims -> " + outputMat.dims());
//
// Mat plane1 = Mat.zeros(outputMat.rows(), outputMat.cols(), CvType.CV_32F);
// Mat plane2 = Mat.zeros(outputMat.rows(), outputMat.cols(), CvType.CV_32F);
//
// CoreFpmImg.fftShift(outputMat, plane1, 0);
// CoreFpmImg.fftShift(outputMat, plane2, 1);
//
// List<Mat> listMat = Arrays.asList(plane1, plane2);
// Core.merge(listMat, outputMat);
//
// for (int i = 0; i < outputMat.rows(); ++i)
// {
// for (int j = 0; j < outputMat.cols(); ++j)
// {
// System.out.print(outputMat.get(i, j)[1] + " ");
// }
// System.out.println("");
// }
// System.out.println("");
//
//
// CoreFpmImg.ifftShift(outputMat, plane1, 0);
// CoreFpmImg.ifftShift(outputMat, plane2, 1);
//
// listMat = Arrays.asList(plane1, plane2);
// Core.merge(listMat, outputMat);
//
// for (int i = 0; i < outputMat.rows(); ++i)
// {
// for (int j = 0; j < outputMat.cols(); ++j)
// {
// System.out.print(outputMat.get(i, j)[1] + " ");
// }
// System.out.println("");
// }
// System.out.println("");
// System.out.println("outputMat dims -> " + outputMat.dims());
}
Something else you might like..
2018/11/13 - [Programming/Java] - JavaFx Drag N Drop event / 자바Fx 드래그앤드롭 이벤트 처리 / Java, C++, example