您好,登錄后才能下訂單哦!
這篇文章將為大家詳細(xì)講解有關(guān)Java+opencv3.2.0怎么實(shí)現(xiàn)hough直線檢測(cè),小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。
hough變換是圖像處理中的一種特征提取技術(shù),該過(guò)程在一個(gè)參數(shù)空間中通過(guò)計(jì)算累計(jì)結(jié)果的局部最大值得到一個(gè)符合特定形狀的集合作為hough變換結(jié)果。
發(fā)展史:
1962年由PaulHough首次提出,用來(lái)檢測(cè)直線和曲線。
1972年由Richard Duda & Peter Hart推廣使用,擴(kuò)展到任意形狀物體的識(shí)別。
原理:
一條直線在直角坐標(biāo)系下的表示形式為y=k*x+b,而在極坐標(biāo)系下表示為r=x*cos(theta)+y*sin(theta)。hough變換的思想為在直角坐標(biāo)系下的一個(gè)點(diǎn)對(duì)應(yīng)極坐標(biāo)系下的一條直線,同樣,極坐標(biāo)系下的一個(gè)點(diǎn)對(duì)應(yīng)直角坐標(biāo)系下的一條直線。在直角坐標(biāo)系中的直線,斜率和截距是一定的,這樣這條直線上的所有點(diǎn)在極坐標(biāo)系中聚焦于一點(diǎn),這樣的聚焦點(diǎn)就代表了直角坐標(biāo)系中的直線。
對(duì)于直線x=c,在實(shí)際應(yīng)用中,是采用參數(shù)方程p=x*cos(theta)+y*sin(theta)。這樣,圖像平面上的一個(gè)點(diǎn)就對(duì)應(yīng)到參數(shù)r—theta平面上的一條曲線上,其它的還是一樣。
標(biāo)準(zhǔn)hough變換:
Imgproc.HoughLines(Mat image, Mat lines, double rho, double theta, int threshold, double srn, double stn, double min_theta, double max_theta)
參數(shù)說(shuō)明:
image:源圖像
lines:hough變換后儲(chǔ)存檢測(cè)到的線條的輸出矢量
rho:以像素為單位的距離精度
theta:以弧度為單位的角度精度
threshold:識(shí)別某部分為一條直線時(shí)必須達(dá)到的值
srn:rho參數(shù)的除數(shù)距離,有默認(rèn)值0
stn:theta參數(shù)的除數(shù)距離,默認(rèn)值0
min_theta:檢測(cè)到的直線的最小角度
max_theta:檢測(cè)到的直線的最大角度
示例代碼:
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); }
累計(jì)概率hough變換:
Imgproc.HoughLinesP(Mat image, Mat lines, double rho, double theta, int threshold, double minLineLength, double maxLineGap)
參數(shù)說(shuō)明:
image:源圖像
lines:hough變換后儲(chǔ)存檢測(cè)到的線條的輸出矢量
rho:以像素為單位的距離精度
theta:以弧度為單位的角度精度
threshold:識(shí)別某部分為一條直線時(shí)必須達(dá)到的值
minLineLength:最低線段的長(zhǎng)度,默認(rèn)為0
maxLineGap:允許將同一行點(diǎn)與點(diǎn)之間連接起來(lái)的最大的距離,默認(rèn)為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); }
源圖片:
標(biāo)準(zhǔn)hough變換結(jié)果:
累計(jì)概率hough變換結(jié)果:
關(guān)于“Java+opencv3.2.0怎么實(shí)現(xiàn)hough直線檢測(cè)”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。