Java+opencv3.2.0實現(xiàn)hough直線檢測
hough變換是圖像處理中的一種特征提取技術(shù),該過程在一個參數(shù)空間中通過計算累計結(jié)果的局部最大值得到一個符合特定形狀的集合作為hough變換結(jié)果。
發(fā)展史:
1962年由PaulHough首次提出,用來檢測直線和曲線。
1972年由Richard Duda & Peter Hart推廣使用,擴展到任意形狀物體的識別。
原理:
一條直線在直角坐標系下的表示形式為y=k*x+b,而在極坐標系下表示為r=x*cos(theta)+y*sin(theta)。hough變換的思想為在直角坐標系下的一個點對應(yīng)極坐標系下的一條直線,同樣,極坐標系下的一個點對應(yīng)直角坐標系下的一條直線。在直角坐標系中的直線,斜率和截距是一定的,這樣這條直線上的所有點在極坐標系中聚焦于一點,這樣的聚焦點就代表了直角坐標系中的直線。
對于直線x=c,在實際應(yīng)用中,是采用參數(shù)方程p=x*cos(theta)+y*sin(theta)。這樣,圖像平面上的一個點就對應(yīng)到參數(shù)r—theta平面上的一條曲線上,其它的還是一樣。
標準hough變換:
Imgproc.HoughLines(Mat image, Mat lines, double rho, double theta, int threshold, double srn, double stn, double min_theta, double max_theta)
參數(shù)說明:
image:源圖像
lines:hough變換后儲存檢測到的線條的輸出矢量
rho:以像素為單位的距離精度
theta:以弧度為單位的角度精度
threshold:識別某部分為一條直線時必須達到的值
srn:rho參數(shù)的除數(shù)距離,有默認值0
stn:theta參數(shù)的除數(shù)距離,默認值0
min_theta:檢測到的直線的最小角度
max_theta:檢測到的直線的最大角度
示例代碼:
public static void main(String[] args)
{
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
Mat srcImage = Imgcodecs.imread("F:\\6597210504144579394.jpg");
Mat dstImage = srcImage.clone();
Imgproc.Canny(srcImage, dstImage, 400, 500, 5, false);
Mat storage = new Mat();
Imgproc.HoughLines(dstImage, storage, 1, Math.PI / 180, 200, 0, 0, 0, 10);
for (int x = 0; x < storage.rows(); x++)
{
double[] vec = storage.get(x, 0);
double rho = vec[0];
double theta = vec[1];
Point pt1 = new Point();
Point pt2 = new Point();
double a = Math.cos(theta);
double b = Math.sin(theta);
double x0 = a * rho;
double y0 = b * rho;
pt1.x = Math.round(x0 + 1000 * (-b));
pt1.y = Math.round(y0 + 1000 * (a));
pt2.x = Math.round(x0 - 1000 * (-b));
pt2.y = Math.round(y0 - 1000 * (a));
if (theta >= 0)
{
Imgproc.line(srcImage, pt1, pt2, new Scalar(255, 255, 255, 255), 1, Imgproc.LINE_4, 0);
}
}
Imgcodecs.imwrite("F:\\dst2.jpg", srcImage);
}
累計概率hough變換:
Imgproc.HoughLinesP(Mat image, Mat lines, double rho, double theta, int threshold, double minLineLength, double maxLineGap)
參數(shù)說明:
image:源圖像
lines:hough變換后儲存檢測到的線條的輸出矢量
rho:以像素為單位的距離精度
theta:以弧度為單位的角度精度
threshold:識別某部分為一條直線時必須達到的值
minLineLength:最低線段的長度,默認為0
maxLineGap:允許將同一行點與點之間連接起來的最大的距離,默認為0
示例代碼:
public static void main(String[] args)
{
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
Mat srcImage = Imgcodecs.imread("F:\\6597210504144579394.jpg");
Mat dstImage = srcImage.clone();
Imgproc.Canny(srcImage, dstImage, 400, 500, 5, false);
Mat storage = new Mat();
Imgproc.HoughLinesP(dstImage, storage, 1, Math.PI / 180, 50, 0, 0);
for (int x = 0; x < storage.rows(); x++)
{
double[] vec = storage.get(x, 0);
double x1 = vec[0], y1 = vec[1], x2 = vec[2], y2 = vec[3];
Point start = new Point(x1, y1);
Point end = new Point(x2, y2);
Imgproc.line(srcImage, start, end, new Scalar(255, 255, 255, 255), 1, Imgproc.LINE_4, 0);
}
Imgcodecs.imwrite("F:\\dst2.jpg", srcImage);
}
源圖片:

標準hough變換結(jié)果:

累計概率hough變換結(jié)果:

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
重試框架Guava-Retry和spring-Retry的使用示例
spring-retry 和 guava-retry 工具都是線程安全的重試,能夠支持并發(fā)業(yè)務(wù)場景的重試邏輯正確性,本文主要介紹了重試框架Guava-Retry和spring-Retry的使用示例,感興趣的可以一下2023-09-09
spring boot+jwt實現(xiàn)api的token認證詳解
這篇文章主要給大家介紹了關(guān)于spring boot+jwt實現(xiàn)api的token認證的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一學習學習吧2018-12-12

