2012-04-18 70 views
1

我遇到了使用JavaCV實現的此項目的問題。我想找到至少,最頂層,最底層的,最左邊和最右邊,最點在二值圖像:JavaCV:如何在二進制圖像中查找重要點

Happy Mouth Binary image

點我的意思是這裏是(x,y)座標。我嘗試實現HoughLines(它只檢測線條,但不是曲線)和cvFindContours,但我無法正確提取座標。我仍然是一個新手,只要我知道白線和背景的價值是什麼,那麼也許我可以繞着圖像循環。

有沒有更簡單的方法?非常感謝您的幫助。

+0

乾草你有沒有找到解決方案?如果是這樣,請分享你的答案。 – 2012-07-17 05:49:19

回答

2

使用相應的功能,您可以使用循環在這裏找到最左側,右側,頂部和底部的點。但是,您需要考慮如何製作一個智能循環。你可以遍歷所有的像素,但你也可以使用更智能的方法。例如,最左邊的點可能在左邊的某處。因此,如果您使用從左到右的掃描線,則可能比找到頂部 - >底部的掃描線更可能找到此像素。這就是說,從圖像中獲取值是很容易的。

比方說,我們有一個圖像binaryImgn渠道。在灰度圖像的情況下n應該是1,但是在彩色圖像的情況下n應該是3.假設我們有指數0 <= y < height,0 <= x < width0 <= k < n。我們能夠以像素(X,Y)的值如下:

((uchar *)(binaryImg->imageData + y*binaryImg->widthStep))[x*binaryImg->nChannels + k] 

由於灰色圖像僅具有單個信道,我們可以檢查如果像素使用是白色:

((uchar *)(binaryImg->imageData + y*binaryImg->widthStep))[x] == 255 

在速度方面,這種解決方案會給O(n)的最壞情況時間,但在實踐中,您不必查看所有像素。

0

如果你有像std::vector<cv::Point2f> pts這樣的點的向量,那麼你可以使用opencv cv::boundingRect方法計算你的點集的右上方的矩形。 使用方法如下:

// this is your set of floating point (filled vector) 
std::vector<cv::Point2f> pts; 
// convert to matrix 
cv::Mat ptsmat(pts); 
// compute the bounding rectangle 
cv::Rect bbox = cv::boundingRect(ptsmat); 

我用C++ OpenCV的API,但你可以在javacv

+0

你在這裏假設KnighK已經找到了他的白點,這是他問的問題之一。另外,它不是最有效的,因爲你說他應該找到所有的白點,而他只是對最左,最右,最高和最低點感興趣。 – dennisg 2012-04-18 10:26:26

+0

對,我在他的問題上做得很快。我會添加一個建議:他應該使用cv :: Mat對象表示圖像並訪問(更容易)像素值(mat.at(x,y))的opencv C++ api – Eric 2012-04-18 13:05:12