我遇到了使用JavaCV實現的此項目的問題。我想找到至少,最頂層,最底層的,最左邊和最右邊,最點在二值圖像:JavaCV:如何在二進制圖像中查找重要點
點我的意思是這裏是(x,y)座標。我嘗試實現HoughLines(它只檢測線條,但不是曲線)和cvFindContours,但我無法正確提取座標。我仍然是一個新手,只要我知道白線和背景的價值是什麼,那麼也許我可以繞着圖像循環。
有沒有更簡單的方法?非常感謝您的幫助。
我遇到了使用JavaCV實現的此項目的問題。我想找到至少,最頂層,最底層的,最左邊和最右邊,最點在二值圖像:JavaCV:如何在二進制圖像中查找重要點
點我的意思是這裏是(x,y)座標。我嘗試實現HoughLines(它只檢測線條,但不是曲線)和cvFindContours,但我無法正確提取座標。我仍然是一個新手,只要我知道白線和背景的價值是什麼,那麼也許我可以繞着圖像循環。
有沒有更簡單的方法?非常感謝您的幫助。
使用相應的功能,您可以使用循環在這裏找到最左側,右側,頂部和底部的點。但是,您需要考慮如何製作一個智能循環。你可以遍歷所有的像素,但你也可以使用更智能的方法。例如,最左邊的點可能在左邊的某處。因此,如果您使用從左到右的掃描線,則可能比找到頂部 - >底部的掃描線更可能找到此像素。這就是說,從圖像中獲取值是很容易的。
比方說,我們有一個圖像binaryImg
與n渠道。在灰度圖像的情況下n應該是1,但是在彩色圖像的情況下n應該是3.假設我們有指數0 <= y < height
,0 <= x < width
和0 <= k < n
。我們能夠以像素(X,Y)的值如下:
((uchar *)(binaryImg->imageData + y*binaryImg->widthStep))[x*binaryImg->nChannels + k]
由於灰色圖像僅具有單個信道,我們可以檢查如果像素使用是白色:
((uchar *)(binaryImg->imageData + y*binaryImg->widthStep))[x] == 255
在速度方面,這種解決方案會給O(n)的最壞情況時間,但在實踐中,您不必查看所有像素。
如果你有像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
乾草你有沒有找到解決方案?如果是這樣,請分享你的答案。 – 2012-07-17 05:49:19