旋转文本图像矫正

#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <iostream>
using namespace cv;
int main( )
{
  cv::Mat srcImage = cv::imread("..\\images\\text.jpg",0);
  if( !srcImage.data ) 
	      return 1;
  srcImage = srcImage.rowRange(0,365);
  cv::imshow("srcImage", srcImage);
  // 图像尺寸转换
  int nRows = srcImage.rows;
  int nCols = srcImage.cols;
  std::cout << "srcImage row:" << nRows << std::endl;
  std::cout << "srcImage col:" << nCols << std::endl;
  // 获取DFT尺寸
  int cRows = cv::getOptimalDFTSize(nRows);
  int cCols = cv::getOptimalDFTSize(nCols);
  std::cout << "DFTImage row:" << cRows << std::endl;
  std::cout << "DFTImage col:" << cCols << std::endl;
  // 图像拷贝,超过边界区域填充为0
  cv::Mat sizeConvMat;
  copyMakeBorder(srcImage, sizeConvMat, 0, cRows -nRows, 0,
     cCols-nCols, cv::BORDER_CONSTANT, cv::Scalar::all(0)); 
  cv::imshow("sizeConvMat", sizeConvMat);

  //  通道组建立,
  cv::Mat groupMats[] = {cv::Mat_<float>(sizeConvMat),
       cv::Mat::zeros(sizeConvMat.size(), CV_32F)};
  cv::Mat mergeMat;
  // 通道合并
  merge(groupMats,2,mergeMat);
  // DFT变换
  dft(mergeMat, mergeMat);
  // 分离通道
  split(mergeMat, groupMats);
  // 计算幅值
  magnitude(groupMats[0], groupMats[1], groupMats[0]);
  cv::Mat magnitudeMat = groupMats[0].clone();
  // 归一化操作
  magnitudeMat += Scalar::all(1);
  log(magnitudeMat, magnitudeMat);
  normalize(magnitudeMat, magnitudeMat, 0, 1, CV_MINMAX);
  magnitudeMat.convertTo(magnitudeMat,CV_8UC1,255,0);
  cv::imshow("magnitudeMat", magnitudeMat);

  // 中心平移
  int cx = magnitudeMat.cols/2;
  int cy = magnitudeMat.rows/2; 
  Mat tmp;
  // Top-Left - 为每一个象限创建ROI
  Mat q0(magnitudeMat,Rect(0,0,cx,cy));
  // Top-Right
  Mat q1(magnitudeMat,Rect(cx,0,cx,cy));
  // Bottom-Left
  Mat q2(magnitudeMat,Rect(0,cy,cx,cy));
  // Bottom-Right
  Mat q3(magnitudeMat,Rect(cx,cy,cx,cy)); 
  // 交换象限 (Top-Left with Bottom-Right)    
  q0.copyTo(tmp);
  q3.copyTo(q0);
  tmp.copyTo(q3);
  // 交换象限 (Top-Right with Bottom-Left)
  q1.copyTo(tmp);
  q2.copyTo(q1);
  tmp.copyTo(q2);
  cv::imshow("magnitudeMat2", magnitudeMat);

  // 固定阈值二值化处理
  cv::Mat binaryMagnMat;
  threshold(magnitudeMat,binaryMagnMat,132,255,CV_THRESH_BINARY);
  cv::imshow("binaryMagnMat", binaryMagnMat);
  // 霍夫变换
  std::vector<Vec2f> lines;
  binaryMagnMat.convertTo(binaryMagnMat,CV_8UC1,255,0);
  HoughLines(binaryMagnMat, lines, 1, CV_PI/180, 100, 0, 0 );
  // 检测线个数
  std::cout << "lines.size:"<< lines.size() << std::endl;
  cv::Mat houghMat(binaryMagnMat.size(),CV_8UC3);
  for( size_t i = 0; i < lines.size(); i++ )
  // 绘制检测线
  {
      float rho = lines[i][0], theta = lines[i][1];
      Point pt1, pt2;
      double a = cos(theta), b = sin(theta);
      double x0 = a*rho, y0 = b*rho;
      pt1.x = cvRound(x0 + 1000*(-b));
      pt1.y = cvRound(y0 + 1000*(a));
      pt2.x = cvRound(x0 - 1000*(-b));
      pt2.y = cvRound(y0 - 1000*(a));
      line( houghMat, pt1, pt2, Scalar(0,255,0), 3, CV_AA);
  }
  cv::imshow("houghMat", houghMat);
  float theta = 0;
  // 检测线角度判断
  for( size_t i = 0; i < lines.size(); i++ )
  {
    float  thetaTemp = lines[i][1]*180/CV_PI;
    if(thetaTemp > 0 && thetaTemp < 90)
    {
        theta = thetaTemp;
        break;
    }
  }
  // 角度转换
  float angelT = nRows* tan(theta/180*CV_PI)/nCols;
  theta = atan(angelT)*180/CV_PI;
  std::cout << "theta:" << theta << std::endl;

// 取图像中心
cv::Point2f centerPoint = cv::Point2f(nCols/2, nRows/2);
double scale = 1;
// 计算旋转矩阵
cv::Mat warpMat = getRotationMatrix2D(centerPoint, theta, scale);
// 仿射变换
cv::Mat resultImage(srcImage.size(), srcImage.type());
cv::warpAffine(srcImage, resultImage, 
  warpMat, resultImage.size());
imshow("resultImage",resultImage);

cv::waitKey(0);
return 0;
}



转载:http://blog.csdn.net/zhuwei1988

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: OpenCvSharp是一个基于OpenCV的开源图像处理库,可以进行图像矫正的处理。 图像矫正是指通过对图像进行旋转、拉伸、扭曲等操作,使其在视觉上更加直观、准确。在OpenCvSharp中,我们可以利用旋转、仿射变换等方法来进行图像矫正。 首先,我们可以使用旋转方法来矫正图像旋转可以通过指定旋转角度和旋转中心来实现。通过计算图像旋转矩阵,然后利用矩阵乘法将图像矩阵进行旋转。这样可以将图像旋转到合适的角度,使其在视觉上更加直观。 其次,我们可以使用仿射变换方法来矫正图像。仿射变换是通过定义一个2x3的仿射矩阵,对图像进行扭曲、缩放、平移等操作。在OpenCvSharp中,可以利用仿射变换方法进行图像矫正。通过计算仿射矩阵中的参数,然后利用仿射变换函数对图像进行扭曲,使其在视觉上更加准确。 总之,OpenCvSharp提供了丰富的图像处理功能,包括图像矫正。通过旋转、仿射变换等方法,我们可以对图像进行直观、准确的矫正处理。 ### 回答2: opencvsharp是基于OpenCV库的一个用于图像处理的开源库,它通过使用C#语言封装了OpenCV的功能,方便开发者使用和调用。在图像处理领域,图像矫正是一种常见的操作,它可以对图像进行校正和调整,使其达到更好的效果和质量。 图像矫正的目的是解决图像中存在的畸变,比如图像在拍摄、传输以及显示过程中产生的旋转、缩放、透视、畸变等问题。常见的图像矫正方法有如下几种: 1. 旋转校正:通过检测图像中的角点或者直线,计算出图像旋转角度,然后将图像进行旋转校正,使其达到正常的方向。 2. 镜像校正:通过检测图像中的水平或者垂直直线,计算出图像的镜像变换矩阵,然后将图像进行镜像校正,使其达到正常的方向。 3. 透视校正:通过检测图像中的四个角点或者多个关键点,计算出图像的透视变换矩阵,然后将图像进行透视校正,使其达到正常形状和尺寸。 4. 畸变校正:通过检测图像中的畸变特征,比如图像中的弯曲、拉伸等问题,计算出图像的畸变校正矩阵,然后将图像进行畸变校正,使其达到正常的形状和比例。 使用opencvsharp进行图像矫正非常简单,首先需要引入库文件,并创建一个Mat类型的对象来加载图像。然后使用相应的函数,比如GetRotationMatrix2D或者GetPerspectiveTransform来计算图像的变换矩阵。最后可以使用函数,比如WarpAffine或者WarpPerspective来进行实际的图像矫正操作。通过调整参数和方式,可以得到不同的矫正效果和结果。 总的来说,opencvsharp是一个强大的图像处理库,可以方便地实现图像矫正功能。利用opencvsharp进行图像矫正,可以提高图像质量和处理效果,使图像达到更好的观赏和应用效果。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值