/****************倾斜校正子程序*****************/
//函数名称:IplImage *Rotate(IplImage *RowImage)
//功能:对每行数字进行倾斜校正
//入口参数:行图像RowImage
//出口参数:旋转后的图像RotateRow
/********************************************/
IplImage *Rotate(IplImage *RowImage)
{    //建立储存边缘检测结果图像canImage
//     IplImage *canImage=cvCreateImage(CvSize(200,300),IPL_DEPTH_8U,1);
    IplImage *canImage=cvCreateImage(cvGetSize(RowImage),IPL_DEPTH_8U,1);
    //进行边缘检测
    cvCanny(RowImage,canImage,30,200,3);
    //进行hough变换
    CvMemStorage *storage=cvCreateMemStorage();
    CvSeq *lines=NULL;
    lines=cvHoughLines2(canImage,storage,CV_HOUGH_STANDARD,1,CV_PI/180,20,0,0);
    //统计与竖直夹角<30度的直线个数以及其夹角和
    int numLine=0;
    float sumAng=0.0;
    for(int i=0;i<lines->total;i++)
    {        float *line=(float *)cvGetSeqElem(lines,i);
        float theta=line[1];  //获取角度 为弧度制
        if(theta<30*CV_PI/180 || (CV_PI-theta)<30*CV_PI/180 )
        {            numLine++;
            sumAng=sumAng+theta;
        }
    }
    //计算出平均倾斜角,anAng为角度制
    float avAng=(sumAng/numLine)*180/CV_PI;
    //获取二维旋转的仿射变换矩阵
    CvPoint2D32f center;
    center.x=float (RowImage->width/2.0);
    center.y=float (RowImage->height/2.0);
    float m[6];
    CvMat M = cvMat( 2, 3, CV_32F, m );
    cv2DRotationMatrix( center,avAng,1, &M);
    //建立输出图像RotateRow
    double a=sin(sumAng/numLine);
    double b=cos(sumAng/numLine);
    int width_rotate=int (RowImage->height*fabs(a)+RowImage->width*fabs(b));
    int height_rotate=int (RowImage->width*fabs(a)+RowImage->height*fabs(b));
    IplImage *RotateRow=cvCreateImage(cvSize(width_rotate,height_rotate),IPL_DEPTH_8U,1);
    //变换图像,并用黑色填充其余值
    m[2]+=(width_rotate-RowImage->width)/2;
    m[5]+=(height_rotate-RowImage->height)/2;
    cvWarpAffine(RowImage,RotateRow, &M,CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS,cvScalarAll(0));
    //释放
    cvReleaseImage(&canImage);
    cvReleaseMemStorage(&storage);
    return RotateRow;
}
int main(int argc, char *argv[])
{//    QCoreApplication a(argc, argv);
    Mat imgMat = imread("20160802.jpeg");//const String* filename);
// Mat imgMat = imread("DSCN6533.png");//const String* filename);
    if(imgMat.empty())return -1; //是否加载成功
   if(!imgMat.data)return -1;//判断是否有数据
//    IplImage pImg= IplImage(imgMat);
    IplImage *pImg = cvLoadImage("20160802.jpeg");
    IplImage *tImg =Rotate(pImg);
//    IplImage* img = cvCreateImage(cvGetSize(mat),8,1);
//   cvGetImage(matI,img);
   cvSaveImage("rice1.png",tImg);
    //建立储存边缘检测结果图像canImage
    return 0;//a.exec();
}

上述代码会报错:

Assertion failed (src.type() == dst.type()) in cvWarpAffine, file /home/lbg/softs/opencv-3.0.0/modules/imgproc/src/imgwarp.cpp, line 6369
terminate called after throwing an instance of 'cv::Exception'
  what():  /home/lbg/softs/opencv-3.0.0/modules/imgproc/src/imgwarp.cpp:6369: error: (-215) src.type() == dst.type() in function cvWarpAffine

下面是python的:

__author__ = 'Administrator'
import sys
import numpyas np
import cv2as cv
import math
from argparseimport ArgumentParser
FILENAME= "1.150000001.png";
 
HOUGH_VOTE= 100
GRAY_THRESH= 150
 
#srcImgOrg : the source image
#srcImgGray : the source image with gray scale
defcalcRotAngle(srcImgOrg,srcImgGray):
angleD = 0
opWidth = cv.getOptimalDFTSize(srcImgGray.shape[1])
opHeight = cv.getOptimalDFTSize(srcImgGray.shape[0])
 
padded = cv.copyMakeBorder(srcImgGray, 0, opWidth - srcImgGray.shape[1] , 0, opHeight- srcImgGray.shape[0], cv.BORDER_CONSTANT);
plane = np.zeros(padded.shape,dtype=np.float32)
planes = [padded,plane]
#Merge into a double-channel image
comImg = cv.merge(planes)
cv.dft(comImg,comImg)
cv.split(comImg, planes)
 
planes[0]= cv.magnitude(planes[0], planes[1]);
magMat = planes[0]
magMat += np.ones(magMat.shape)
cv.log(magMat,magMat);
 
cx = magMat.shape[1] / 2;
cy = magMat.shape[0] / 2
q0 = magMat[0:cx,0: cy ]
q1 = magMat[cx:,0: cy]
q2 = magMat[0:cx, cy:]
q3 = magMat[cx:,cy:]
c1 = np.vstack((q3,q2))
c2 = np.vstack((q1,q0))
magMat2 = np.hstack((c1,c2))
 
cv.normalize(magMat2, magMat,0, 1,cv.NORM_MINMAX);
magMat = cv.resize(magMat,(magMat.shape[0] / 2,magMat.shape[1]/2))
magMat = magMat * 255
magMat = cv.threshold(magMat,GRAY_THRESH,255,cv.THRESH_BINARY)[1].astype(np.uint8)
lines = cv.HoughLines(magMat,1,np.pi/180,HOUGH_VOTE);
#cv.imshow("mag_binary", magMat);
#lineImg = np.ones(magMat.shape,dtype=np.uint8)
angle = 0
if lines!= None andlen(lines) != 0:
for linein lines[0]:
#print line
rho = line[0]
theta = line[1]
if (theta< (np.pi/4. ))or (theta > (3.*np.pi/4.0)):
print'Vertical line , rho : %f , theta : %f'%(rho,theta)
pt1 = (int(rho/np.cos(theta)),0)
pt2 = (int((rho-magMat.shape[0]*np.sin(theta))/np.cos(theta)),magMat.shape[0])
#cv.line( lineImg, pt1, pt2, (255))
angle = theta
else:
print'Horiz line , rho : %f , theta : %f'%(rho,theta)
pt1 = (0,int(rho/np.sin(theta)))
pt2 = (magMat.shape[1], int((rho-magMat.shape[1]*np.cos(theta))/np.sin(theta)))
#cv.line(lineImg, pt1, pt2, (255), 1)
angle = theta + np.pi / 2
#cv.imshow('lineImg',lineImg)
#Find the proper angel
if angle> (np.pi / 2):
angle = angle - np.pi
 
#Calculate the rotation angel
#The image has to be square,
#so that the rotation angel can be calculate right
print'angle : %f'% angle
 
#print srcImgOrg.shape
alpha = float(srcImgOrg.shape[1])/ float(srcImgOrg.shape[0])
print'alpha : %f'% alpha
if alpha> 1:
angleT = srcImgOrg.shape[1] * np.tan(angle)/ srcImgOrg.shape[0];
angleD = np.arctan(angleT) * 180/ np.pi;
else:
angleD = angle * 180 / np.pi
print'angleD : %f'% angleD
return angleD
 
defrotImage(srcImgOrg,angleD):
size = srcImgOrg.shape
centerPnt = (srcImgOrg.shape[1] /2,srcImgOrg.shape[0] / 2)
rotMat = cv.getRotationMatrix2D(centerPnt,angleD,scale=1.);
resultImg = cv.warpAffine(srcImgOrg,rotMat,(size[1],size[0]));
 
#cv.imshow('srcImgOrg',srcImgOrg);
#resultImg = cv.resize(resultImg,(resultImg.shape[0] / 2,resultImg.shape[1]/2))
#cv.imshow("resultImg",resultImg);
fileParts = fileName.split('.')
fileParts[-2]= fileParts[-2]+ '-r'
file= '.'.join(fileParts)
print"file name : %s"% file
 
ret = cv.imwrite(file,resultImg)
 
defhandleImage(fileName):
srcImgOrg = cv.imread(fileName)
srcImgGray = cv.imread(fileName,cv.IMREAD_GRAYSCALE).astype(np.float32);
angle = calcRotAngle(srcImgOrg,srcImgGray)
if angle> 0:
rotImage(srcImgOrg,angle)
 
defmain():
p = ArgumentParser(usage='it is usage tip',description='this is a usage tip')
p.add_argument('--file',default="./",help='input file name')
args = p.parse_args()
#print args.file
handleImage(args.file)
 
if__name__ == '__main__':
main()
#rotImage(FILENAME)

cv.waitKey( 0)

参考:https://github.com/lyzh1688/SlantCorrection

opencv图像校正(摄像头校正)

需要事先标定:

http://download.csdn.net/download/hs5530hs/9046567

需要事先标定:

http://blog.csdn.net/zht9961020/article/details/7036786

opencv倾斜矫正相关推荐

  1. opencv图像处理中的一些滤波器+利用滤波器提取条形码(解析二维码)+公交卡倾斜矫正+物体尺寸丈量

    一般来说,图像的能量主要集中在其低频部分,噪声所在的频段主要在高频段,同时图像中的细节信息也主要集中在其高频部分,因此,如何去掉高频干扰同时又保持细节信息是关键.为了去除噪声,有必要对图像进行平滑,可 ...

  2. openCV图片倾斜矫正(java版)

    核心思想:由于openCV是用C编写,因此对C的支持度最高,曾经尝试转换成JAVA,最终都失败了,因此核心底层代码仍然是C版的 基本思路:java调用dll客户端->生成.h头文件->新建 ...

  3. opencv图片倾斜矫正

    #include <opencv2/opencv.hpp> #include <iostream> #include <math.h> using namespac ...

  4. C# OpenCV EmguCV实现扫描文本图像倾斜矫正 实现详解(附源码)

    一.扫描文本倾斜矫正 实现步骤可以参考如下链接: https://blog.csdn.net/stq054188/article/details/120031667?spm=1001.2014.300 ...

  5. python图像倾斜校正_图像倾斜矫正

    没有找到关于图像倾斜矫正的综述性文献,那就自己整理一下吧. 图像倾斜可以分为两种情况,一种是平面倾斜,这种情况下拍照设备与试卷平行,拍出来的图像只需要进行旋转即可完成矫正:另一种是Z轴倾斜,这种情况下 ...

  6. matlab 倾斜矫正,matlab图像倾斜校正

    4 图像颜色畸变校正介绍图像颜色畸变现象可以是由摄像器材导致,也可以是由于真实环境本身就偏 色导致,还有的是由于图像放置过久氧化.老化导致.无论其产生的原因如何, 其校正方法都是类似的.如果用 Mat ...

  7. python图像倾斜校正_霍夫变换 文本图片倾斜矫正 python实现

    一.霍夫变换原理简介 霍夫变换主要是利用图片所在的空间和霍夫空间之间的变换,将图片所在的直角坐标系中具有形状的曲线或直线映射到霍夫空间的一个点上形成峰值,从而将检测任意形状的问题转化成了计算峰值的问题 ...

  8. ocr 图像倾斜矫正-霍夫变换

    图像预处理 在ocr处理时候,可能遇到的图片会是倾斜的,导致检测不全问题,进而影响后续识别问题. 常见的倾斜矫正方法 霍夫轮廓检测 randon 变换 基于PCA的方法 霍夫变换 基本原理 可以识别图 ...

  9. 基于matlab的蓝色车牌识别(车牌倾斜矫正)

    目录 一 处理流程 二 结果展示 三 核心要点解读 四 matlab代码实现 整套方案好包括以下博客: (1)基于matlab的蓝色车牌识别(绪论) (2)基于matlab的蓝色车牌识别(车牌定位) ...

最新文章

  1. 主流微服务全链路监控系统之战
  2. C#中使用SoundPlayer播放音频文件(wav文件)
  3. Java之JVM调优案例分析与实战(1) - 高性能硬件上的程序部署策略
  4. Ubuntu 16设置固定IP和DNS
  5. linux 学习笔记 显示压缩文件 gong.zip 的文件内容
  6. python学习笔记(五)缩进
  7. ajax排行页面,ajax简单页面
  8. pcb设计单点接地示意图_4种PCB设计中的接地方式解析
  9. 2020年最好用的手机是哪一款_2020年入手5G手机最佳时期到了:5款最佳手机,您认可哪款...
  10. RUNTIME_CLASS
  11. android 模拟器优化,Android模拟器大幅优化 为开发者谋福利
  12. 【视频插帧】XVFI: eXtreme Video Frame Interpolation
  13. LSD-SLAM运行过程及报错 “what(): Duration is out of dual 32-bit range“
  14. scala中的match详解
  15. android10管理权限,Android 权限管理
  16. 转区系统开放艾欧尼亚转入服务器,LOL转区系统申请客户端及操作流程介绍
  17. 数字集成电路——电路、系统与设计
  18. 5分钟使用Unity制作AR应用,结合Vuforia SDK制作AR
  19. 如何使用#define_CRT_SECURE_NO_WARNINGS
  20. 各版本iphone屏幕分辨率和cocos2d下size

热门文章

  1. 什么是mysql分发版_MySQL:使用源码分发版还是二进制分发版
  2. fir fpga 不同截止频率_【通信篇】带你认识FIR滤波器
  3. c++ pipe 同步 互斥_数一数Linux中有多少种线程同步策略-『Linux 源码解析(二)』...
  4. 服务器预装操作系统,服务器预装操作系统吗
  5. python注释_不建议使用Java注释的正确方法
  6. linux服务器崩,Linux系统崩溃最快速的解决方法
  7. Mybatis Plus 是如何实现动态 SQL 语句的?原理你懂吗?
  8. 皮一皮:下雨也阻止不了!
  9. 2021年6月程序员工资排行榜,南京这是怎么了?有啥大动作吗?
  10. 调查与讨论:你在调用别人接口的时候有考虑过失败情况吗?