opencv倾斜校正 java,OpenCV实现基于傅里叶变换的旋转文本校正

代码

先给出代码,再详细解释一下过程:

#include

#include

#include

#include

using namespace cv;

using namespace std;

#define GRAY_THRESH 150

#define HOUGH_VOTE 100

//#define DEGREE 27

int main(int argc, char **argv)

{

//Read a single-channel image

const char* filename = "imageText.jpg";

Mat srcImg = imread(filename, CV_LOAD_IMAGE_GRAYSCALE);

if(srcImg.empty())

return -1;

imshow("source", srcImg);

Point center(srcImg.cols/2, srcImg.rows/2);

#ifdef DEGREE

//Rotate source image

Mat rotMatS = getRotationMatrix2D(center, DEGREE, 1.0);

warpAffine(srcImg, srcImg, rotMatS, srcImg.size(), 1, 0, Scalar(255,255,255));

imshow("RotatedSrc", srcImg);

//imwrite("imageText_R.jpg",srcImg);

#endif

//Expand image to an optimal size, for faster processing speed

//Set widths of borders in four directions

//If borderType==BORDER_CONSTANT, fill the borders with (0,0,0)

Mat padded;

int opWidth = getOptimalDFTSize(srcImg.rows);

int opHeight = getOptimalDFTSize(srcImg.cols);

copyMakeBorder(srcImg, padded, 0, opWidth-srcImg.rows, 0, opHeight-srcImg.cols, BORDER_CONSTANT, Scalar::all(0));

Mat planes[] = {Mat_(padded), Mat::zeros(padded.size(), CV_32F)};

Mat comImg;

//Merge into a double-channel image

merge(planes,2,comImg);

//Use the same image as input and output,

//so that the results can fit in Mat well

dft(comImg, comImg);

//Compute the magnitude

//planes[0]=Re(DFT(I)), planes[1]=Im(DFT(I))

//magnitude=sqrt(Re^2+Im^2)

split(comImg, planes);

magnitude(planes[0], planes[1], planes[0]);

//Switch to logarithmic scale, for better visual results

//M2=log(1+M1)

Mat magMat = planes[0];

magMat += Scalar::all(1);

log(magMat, magMat);

//Crop the spectrum

//Width and height of magMat should be even, so that they can be divided by 2

//-2 is 11111110 in binary system, operator & make sure width and height are always even

magMat = magMat(Rect(0, 0, magMat.cols & -2, magMat.rows & -2));

//Rearrange the quadrants of Fourier image,

//so that the origin is at the center of image,

//and move the high frequency to the corners

int cx = magMat.cols/2;

int cy = magMat.rows/2;

Mat q0(magMat, Rect(0, 0, cx, cy));

Mat q1(magMat, Rect(0, cy, cx, cy));

Mat q2(magMat, Rect(cx, cy, cx, cy));

Mat q3(magMat, Rect(cx, 0, cx, cy));

Mat tmp;

q0.copyTo(tmp);

q2.copyTo(q0);

tmp.copyTo(q2);

q1.copyTo(tmp);

q3.copyTo(q1);

tmp.copyTo(q3);

//Normalize the magnitude to [0,1], then to[0,255]

normalize(magMat, magMat, 0, 1, CV_MINMAX);

Mat magImg(magMat.size(), CV_8UC1);

magMat.convertTo(magImg,CV_8UC1,255,0);

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值