标准霍夫变换HoughLines()
原型
void HoughLines(
InputArray image,
OutputArray lines,
double rho,
double theta,
int threshold,
double srn=0,
double stn=0
);
参数
- image:输入图像(8位单通道)
- lines:输出的线条组。一般是
vector<Vec2f> lines;
- rho:以像素为单位的距离精度
- theta:以弧度为单位的角度精度
- threshold:累加平面的阈值。大于threshold的线才可以被检测到
- srn:
- stn:srn和stn都为0,表示使用经典的霍夫变换
例子
#include<iostream>
#include<opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main()
{
Mat srcImage=imread("M.jpg");
Mat cannyImage,dstImage;
Canny(srcImage,cannyImage,50,200,3);
cvtColor(cannyImage,dstImage,COLOR_GRAY2BGR);
vector<Vec2f> lines;
HoughLines(cannyImage,lines,1,CV_PI/180,150,0,0);
for(size_t i=0;i<lines.size();i++)
{
double 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(x0-1000*(a));
line(dstImage,pt1,pt2,Scalar::all(255),1);
}
namedWindow("dstImage",WINDOW_NORMAL);
imshow("dstImage",dstImage);
waitKey();
return 0;
}
仿射变换warpAffine()
原型
void warpAffine(
InputArray src,
OutputArray dst,
InputArray M,
Size dsize,
int flags=INTER_LINEAR,
int borderMode=BORDER_CONSTANT,
const Scalar &borderValue=Scalar()
);
参数
- src:输入图像
- dst:输出图像
- M:2*3的变换矩阵
- dsize:输出图像的尺寸
- flags:插值方法类型
- INTER_NEAREST:最近邻插值
- INTER_LINEAR:线性插值(默认)
- INTER_AREA:区域插值
- INTER_CUBIC:三次样条插值
- INTER_LANCZOS4:Lanczos插值
- CV_WARP_FILL_OUTLIERS:填充所有输出图像的像素。
- CV_WARP_INVERSE_MAP:输出图像到输入图像的反变换。
- borderMode:边界像素模式
- borderValue:边界值
例子
#include<iostream>
#include<opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main()
{
Mat srcImage=imread("M.jpg");
Mat cannyImage,dstImage;
Canny(srcImage,cannyImage,50,200,3);
cvtColor(cannyImage,dstImage,COLOR_GRAY2BGR);
vector<Vec2f> lines;
HoughLines(cannyImage,lines,1,CV_PI/180,150,0,0);
for(size_t i=0;i<lines.size();i++)
{
double 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(x0-1000*(a));
line(dstImage,pt1,pt2,Scalar::all(255),1);
}
namedWindow("dstImage",WINDOW_NORMAL);
imshow("dstImage",dstImage);
waitKey();
return 0;
}