2014-03-13 47 views
-1

任何人都可以通過閱讀Docs來幫助我學習如何使用庫,在我的示例OpenCV for Java中?我的意思是,我從這裏瞭解:如何從庫的JavaDoc中「學習」

How do i read java documentation?

一個文件未完成學習,而是看如何使用的方法和類等 不過,假設我絕對需要有一定的功能,我猜只有可能的方法是查找文檔。例如。我希望做一個HoughTransformation,我谷歌將其與「霍夫變換OpenCV中的Java」和

http://docs.opencv.org/java/org/opencv/imgproc/Imgproc.html#HoughLines(org.opencv.core.Mat, org.opencv.core.Mat, double, double, int)

好了,到目前爲止一切順利結束。我看到如何使用它。但是我怎麼能理解輸出參數Mat lines的返回格式呢?我根本不知道。就我所見,目前還沒有任何關於在Java中使用OpenCV的大書籍,而C/C++中的閱讀示例並不能幫助我,因爲數據類型的結構等不同,所以我不能簡單地在Java中採用這些示例。

如何去正確的方法呢? 非常感謝!

回答

2

首先,Mat假設一個矩陣,所以應該對矩陣的外觀有所瞭解。如果你看看MAT文檔,你可能會得到一些關於MAT對象表示的一般概念。其次,如果你知道你在做什麼,即理解域,那麼一個寫得很好並且有文檔記錄的API應該是合理的。但是,如果你感冒並且對你所在的領域毫無頭緒,我建議你寫一個測試程序。簡單的程序與主,初始化一個Imgproc對象。開始將一些有意義的數據傳遞給您想要使用的API。通過調試器或簡單地轉儲對象輸出來檢查您得到的結果。你甚至可以用自定義的toString字段來擴展MAT和Imgproc類,這些字段可以爲你打印出一些數據。您也可以重寫某些方法,超級用戶調用它們然後檢查它們的立即輸出。 底線,寫一個測試程序,degub,分析輸出和錯誤,如果可能的話一步一步通過代碼,並追上你長期被遺忘的大學數學,然後沖洗並重復。

從技術上講,它是爲了封裝的原因。一個好的API應該隱藏關於事情如何完成的醜陋細節,並且只向您提供一條滿足您提供的參數的簡單消息。您可以編寫各種測試用例來查看它是如何響應的。你可以猜測它應該如何運作和測試這些假設。最終你會很好地理解它是如何工作的。假設我有一個API,它說String getFirstName(String lastName)我可以很容易地驗證getFirstName返回給定姓氏的FirstName。現在讓我說我有mySpecialClass getFirstName(String lastName);我將不得不仔細檢查mySpecialClass以查看它封裝的內容。可能是FirstName作爲鍵和LastName作爲值的內部映射。對於我所知的所有內容,可能只會公開getKey和getValue。不直觀,但如果有人有充分的理由認爲這將是在某些情況下表示姓名的最佳方式。爲什麼不呢?你要麼可以閱讀API和懂積極消費,並驗證你的假設

+0

是的,但我發現它很奇怪,我需要調試/試錯最簡單的東西,因爲我找不到任何東西,沒有教程和/或例子。我確實知道Mat是一個矩陣,但是如何管理內部的層次結構 - 我的部分是找出它?我的意思是當用戶需要時間和時間來弄清楚如何使用它時,爲什麼要提供產品!?我以某種方式發現它很奇怪。 – tim

+0

從技術上講,它是爲了封裝的原因。一個好的API應該隱藏關於事情如何完成的醜陋細節,並且只向您提供一條滿足您提供的參數的簡單消息。您可以編寫各種測試用例來查看它是如何響應的。你可以猜測它應該如何運作和測試這些假設。最終你會很好地理解它是如何工作的。假設我有一個說String getFirstName(String lastName)的API我可以通過驗證getFirstName返回給定姓氏的FirstName。 – myqyl4

+0

當然,如果這些是簡單的數據類型,則爲true。但就我而言......我當然知道結果是按照矩陣組織的,但我不知道具體如何。我發現它在某種程度上非常有趣,幾乎現在有關於它在互聯網上的信息,我想知道所有那些使用OpenCV的人都知道如何做到這一點......試驗和錯誤每次都是真的嗎? :( – tim

1

在鏈接你提供http://docs.opencv.org/java/org/opencv/imgproc/Imgproc.html#HoughLines%28org.opencv.core.Mat,%20org.opencv.core.Mat,%20double,%20double,%20int%29它指向的方法HoughLines:

公共靜態無效HoughLines(馬太福圖像, 墊線, 雙RHO, 雙θ表示 INT閾值)

什麼是括號內並非「輸出參數」,你叫他們,但輸入參數。這是你賦予的功能,而不是它賦予你的功能。函數返回給你的是函數名稱左側的類型。在這種情況下,它的void,這是什麼。

它需要一些標準類型的參數(double,int)和一些MatMat被格式化爲鏈接,所以如果您不知道它是什麼,請點擊它以查看類型爲Mat的文檔。

+0

謝謝是的,我已經計算出來了,現在我將輸出參數定義爲'Mat lines = new Mat()'並將其作爲第二個參數傳遞。但是我無法弄清楚輸出的確切結構因爲它沒有完全提及。我嘗試採用這些代碼的一些部分:http://www.roberttadlock.com/blog/2013/7/11/android-and-opencv.html但是訪問元素通過'data = lines.get(0,i); rho = data [0]; theta = data [1];'沒有工作,我根本沒有任何關於如何組織數據的信息。 – tim

+0

對不起,是的,我知道這不是'OUTPUT'-參數,我的意思是我知道我把它傳入內部......但仍然是結果存儲在最後的參數(可能作爲參考傳遞)。這就是爲什麼我這樣稱呼它是爲了澄清這是存儲結果的MAT :) – tim

+0

我想你應該閱讀關於http://docs.opencv.org/java/org/opencv/core/Mat的所有介紹部分.html,也許看看http://docs.opencv.org/doc/tutorials/tutorials.html上的教程。但事實是,3D圖形的東西很複雜。 – developerwjk

1

要完成myqyl4的答案,在OpenCV的特定情況下,它有助於瞭解C++是OpenCV的基礎。 Java,Android和Python版本大部分都是C++代碼的包裝。

C++代碼更詳細地記錄在案。例如墊:

http://docs.opencv.org/modules/core/doc/basic_structures.html#mat

所以對於Java墊類,你可以隨時檢查它的源代碼(它相當簡單,一個墊基本上是由場組成的寬度,高度,類型和實際數據) ,而它所沒有的東西就是C++文檔所描述的。 Mat類型在C++文檔中有詳細描述。

要訪問墊數據,你可以檢查this SO answer