OpenCV-霍夫變換
author@jason_ql
http://blog.csdn.net/lql0716/
- 標準霍夫變換(Standard Hough Transform, SHT)
- 多尺度霍夫變換(Multi—Scale Hough Transform, MSHT)
- 累計概率霍夫變換(Progressive Probabilistic Hough Transform,PPHT)
相關函數
- HoughLines()直線檢測
該函數對應標準霍夫變換(SHT)、多尺度霍夫變換(MSHT)。
C++: void HoughLines(InputArray image, OutputArray lines, double rho, double theta, int threshold, double srn=0, double stn=0)
第一個參數:InputaArray類型的image,原圖像,8位單通道二進制。
第二個參數:InputArray類型的lines,經過調用HoughLines函數後儲存了霍夫變換檢測到線條的輸出矢量。每一條線由具有兩個元素的矢量(rou,theta)表示,其中rou爲到座標原點(0,0)(原點爲圖像的左上角)的距離,theta是弧度線條旋轉角度(0度表示垂直線,pi/2度表示水平線)。
第三個參數:double類型的rho,以像素爲單位的距離精度。另一種表述方式是直線搜索時的進步尺寸的單位角度。
第四個參數:double類型的theta,以弧度爲單位的角度精度。另一種表述方式是直線搜索時的進步尺寸的單位角度。
第五個參數:int類型的threshold,累加平面的閾值參數,即識別某部分爲圖中的一條直線時它在累加平面中必須達到的值。大於閾值threshold的線段纔可以被檢測通過並返回到結果中。
第六個參數:double類型的srn,默認值爲0.對於多尺度的霍夫變換,這是第三個參數進步尺寸rho的除數距離。粗略的累加器進步尺寸直接是第三個參數rho,而精確的累加器進步尺寸爲rho/srn。
第七個參數:double類型的stn,默認值爲0.對於多尺度霍夫變換,srn表示第四個參數進步尺寸的單位角度theta的除數距離。且如果srn和stn同時爲0,就表示使用經典的霍夫變換,否則這兩個參數應該都爲正數。
HoughLinesP() 直線檢測
該函數對應累計概率霍夫變換PPHT。HoughCircles() 圓檢測
霍夫變換示例代碼
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
int main()
{
// String path = "/home/jason/jason2/photo/cylinder/target_cylinder.jpg";
String path = "/home/jason/jason2/photo/cylinder/01.jpg";
cv::Mat img1, img2, gray1, gray2;
img1 = cv::imread(path);
cv::cvtColor(img1, gray1, cv::COLOR_BGR2GRAY);
cv::Canny(img1, img2, 50, 100);
// cv::cvtColor(img2, gray2, cv::COLOR_BGR2GRAY);
cv::vector<Vec2f> lines;
cv::HoughLines(img2, lines, 1, CV_PI/180, 150, 0, 0);
cv::Point v0;
v0.x = 0;
v0.y = 1;
for(size_t i = 0; i < lines.size(); i++)
{
float rho = lines[i][0], theta = lines[i][1];
cv::Point pt1, pt2, v1;
double a = cos(theta), b = sin(theta);
double x0 = a*rho, y0 = b*rho;
pt1.x = round(x0 + 1000 * (-b));
pt1.y = round(y0 + 1000 * a);
pt2.x = round(x0 - 1000 * (-b));
pt2.y = round(y0 - 1000 * a);
v1 = pt1 - pt2;
if( (v0.x * v1.y + v0.y * v1.x) == 0)
{
line(img1, pt1, pt2, Scalar(0, 255, 0), 2, CV_AA);
}
}
cv::namedWindow("原圖", cv::WINDOW_NORMAL);
cv::namedWindow("直線", cv::WINDOW_NORMAL);
cv::imshow("原圖", img1);
cv::imshow("直線", img2);
cv::waitKey(0);
return 0;
}
#霍夫變換圓檢測
#include <cv.h>
#include <highgui.h>
#include <math.h>
using namespace cv;
int main(int argc, char** argv)
{
Mat img, gray;
if( argc != 2 && !(img=imread(argv[1], 1)).data)
return -1;
cvtColor(img, gray, CV_BGR2GRAY);
// smooth it, otherwise a lot of false circles may be detected
GaussianBlur( gray, gray, Size(9, 9), 2, 2 );
vector<Vec3f> circles;
HoughCircles(gray, circles, CV_HOUGH_GRADIENT,
2, gray->rows/4, 200, 100 );
for( size_t i = 0; i < circles.size(); i++ )
{
Point center(cvRound(circles[i][0]), cvRound(circles[i][1]));
int radius = cvRound(circles[i][2]);
// draw the circle center
circle( img, center, 3, Scalar(0,255,0), -1, 8, 0 );
// draw the circle outline
circle( img, center, radius, Scalar(0,0,255), 3, 8, 0 );
}
namedWindow( "circles", 1 );
imshow( "circles", img );
return 0;
}
- 相關文章