2017-04-20 104 views
2

我正在嘗試使用C++的OpenCV庫幫助解決識別問題。在圖像上搜索輪廓

我有一些文字(下),我想分開這個文本中的每個符號使用cvFindContours(...)函數。之後,我想將每個分離的符號發送到神經網絡的輸入端以進行識別。一切都好。我可以在我的圖像中獲取所有輪廓,並且可以使用幫助cvDrawContours(...)函數(下圖)在圖像上繪製輪廓。但是cvFindContours(...)返回無序序列(在此序列中第一個輪廓上的指針),其中包含所有找到的輪廓。對於我的任務順序非常重要。

CVAPI(int) cvFindContours(CvArr* image, CvMemStorage* storage, CvSeq** first_contour, 
          int header_size CV_DEFAULT(sizeof(CvContour)), 
          int mode CV_DEFAULT(CV_RETR_LIST), 
          int method CV_DEFAULT(CV_CHAIN_APPROX_SIMPLE), 
          CvPoint offset CV_DEFAULT(cvPoint(0,0))); 

-image - 源圖像

-storage - 用於存儲其中包含輪廓

-first_contour - 指向第一輪廓在存儲

-mode - 搜索的模式(I使用CV_RETR_EXTERNAL用於搜索外部輪廓)

-method - 近似的方法(我使用的是CV_CHAIN_APPROX_SIMPLE默認)

Source image

Source image with drawn a bound rectangles

我怎樣才能讓cvFindContours(...)函數返回的輪廓中的順序,他們中的圖片?可能嗎?

謝謝!

回答

1

您不能直接強制findContours以某種順序產生輪廓(我的意思是在函數調用中沒有調整它的參數)。

要按照「讀取文本」順序對輪廓進行排序,您可以執行循環遍歷所有輪廓,併爲每個輪廓檢索最左邊的點,可以直接遍歷每個對象中的所有點,或通過使用邊界框(例如參見minAreaRect)。
一旦你有了所有這些點,從左到右和從下到上排列它們(可能需要進行一些調整,比如檢測在高度範圍內開始的所有輪廓都是同一文本行的一部分)

+0

我想我明白你的意思。這很簡單。我是失敗者:D。 謝謝! @Soltius – rekrut

1

您已經找到圖像中存在的所有輪廓的邊界矩形。您可以根據每個輪廓的質心對您的輪廓進行排序,因爲您的方法適用於文本,所以它更加健壯,而不是使用最左邊的點方法。

THIS ANSWER來自OpenCV的社區可能有助於提供一個開始

+0

謝謝你的回答! – rekrut

+0

@rekrut查看[THIS](http://answers.opencv.org/question/99255/how-to-sort-contours-left-to-right-while-going-top-to-bottom/)以及 –