影像變換(7):標準霍夫變換:HoughLines()函式
此函式可以找出采用標準霍夫變換的二值影像線條,在 OpenCV中,我們可以用其來呼叫標準霍夫變換SHT和多尺度霍夫變換 MSHT的 OpenCV內建演算法,

第一個引數,InputArray型別的image,輸入影像,即源影像,需為8位的單通道二進制影像,可以將任意的源圖載入進來,并由函式修改成此格式后,再填在這里,
第二個引數,InputArray型別的lines,經過呼叫HoughLines函式后儲存了霍夫線變換檢測到線條的輸出矢量,每一條線由具有兩個元素的矢量( p,0 )表示,其中,p是離坐標原點(0,0)(也 就是影像的左上角)的距離,0是弧度線條旋轉角度(О度表示垂直線,Tt/2度表示水平線),
第三個引數,double型別的 rho,以像素為單位的距離精度,另一種表述方式是直線搜索時的進步尺寸的單位半徑,(Latex 中/rho即表示p )
第四個引數,double型別的theta,以弧度為單位的角度精度,另一種表述方式是直線搜索時的進步尺寸的單位角度,
第五個引數,int型別的threshold,累加平面的閾值引數,即識別某部分為圖中的一條直線時它在累加平面中必須達到的值,大于閾值 threshold的線段才可以被檢測通過并回傳到結果中,
第六個引數,double型別的srn,有默認值0,對于多尺度的霍夫變換,這是第三個引數進步尺寸rho 的除數距離,粗略的累加器進步尺寸直接是第三個引數rho,而精確的累加器進步尺寸為rho/srn,
第七個引數,double型別的 stn,有默認值0,對于多尺度霍夫變換,srn表示第四個引數進步尺寸的單位角度theta的除數距離,且如果srn和 stn同時為0,就表示使用經典的霍夫變換,否則,這兩個引數應該都為正數,
學完函式決議后,看一個以HoughLines為核心的示例程式,就可以全方位了解 HoughLines函式的使用方法,
代碼如下:
#include <opencv2/opencv.hpp>
#include<opencv2/core/core.hpp>
#include"opencv2/highgui/highgui.hpp"
#include<opencv2/imgproc/imgproc.hpp>
#include <opencv2/core/utils/logger.hpp>
#include<iostream>
#include<time.h>
using namespace std;
using namespace cv;
int main()
{
cv::utils::logging::setLogLevel(utils::logging::LOG_LEVEL_SILENT);//控制臺不在輸出日志檔案
Mat srcImage = imread("E:/pictures/2.jpg");
Mat midImage, dstImage;
Canny(srcImage, midImage, 50, 200, 3);
cvtColor(midImage, dstImage, COLOR_GRAY2BGR);
vector<Vec2f>lines;
HoughLines(midImage, lines, 1, CV_PI / 180, 150, 0, 0);
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(dstImage, pt1, pt2, Scalar(55, 100, 195), 1, LINE_AA);
}
imshow("【原始圖】", srcImage);
imshow("【邊緣檢測后的圖】", midImage);
imshow("【效果圖】", dstImage);
waitKey(0);
return 0;
}
運行截圖:


轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/434544.html
標籤:AI
