夥計們。該圖像有兩個輪廓。我可以用opencv findcontour函數找到它們。我想知道的是如何判斷哪條輪廓線和哪條輪廓線是曲線?任何人都可以告訴如何去做?任何建議將被認真考慮。先謝謝了。
回答
首先假定你有一條線,並應用一些基本的代數。
首先找到線的斜率和y截距。線的斜率被定義爲y的變化除以x的變化。所以給出了兩個點(X0,Y0),(X1,Y1):
y = mx + b
b = y - mx
所以
:slope = (y0-y1)/(x0-x1)
的y截距是使用斜率截距方程(y=mx+b)
並求解對於b發現
y_intercept = y0 - slope * x0
一旦你有斜率和Y軸截距,你只需要遍歷輪廓的點,看看所有的點是否落在同一條線上。如果他們這樣做,你有一條線;如果他們不這樣做,你會有一條曲線。
因爲我不知道你正在使用什麼語言,這裏是僞代碼的整個過程:
// First assume you have a line - find the slope and y-intercept
slope = (point[0].y - point[1].y)/(point[0].x - point[1].x);
y_intercept = point[0].y - (slope * point[0].x);
// Using slope-intercept (y = mx + b), see if the other points are on the same line
for (n = 0 to numPoints)
{
if ((slope * point[n].x + y_intercept) != point[n].y)
{
// You've found a point that's not on the line - as soon as you
// find a point that's not on the line, you know that the contour
// is not a straight line
}
}
請注意,您使用浮點數這裏要處理,所以你」在if
條件中必須考慮到這一點 - 您無法直接比較浮點數的相等性,因此您需要將它們舍入到某個可接受的準確度。爲了保持僞代碼的簡單性,我放棄了這一點。
幾點:使用前兩個點來定義線條可能會產生很大的噪音,因爲它們非常接近。使用第一個和最後一個點應該會更好。使用一維斜率和截距不適用於垂直線。因此,最好用2D矢量(起始點和方向)定義線,然後計算點與線的實際距離。 –
嗨,Jeff&Nico。非常感謝你。現在我明白並知道如何去做。感謝您的傑出答案! –
- 1. 在OpenCV中關閉輪廓曲線
- 2. OpenCV C++:通過輪廓區域對輪廓線進行排序
- 3. 我如何平滑OpenCV中的曲線(輪廓)?
- 4. 如何判斷bonjour服務是無線還是藍牙?
- 5. 如何通過opencv計算提取輪廓的曲率?
- 6. 如何判斷線程是否通過其ID與C#運行
- 7. 如何通過代碼判斷iPad是黑色還是白色?
- 8. 如何判斷用戶是否離線
- 9. 如何判斷庫是COM還是DCOM?
- 10. 如何知道一般路徑是直線還是曲線?
- 11. 如何通過opencv判斷場景是否黑暗?
- 12. 輪廓線閃爍
- 13. 我如何知道opencv中的輪廓是打開還是關閉?
- 14. 如何用opencv填充輪廓線?例如,
- 15. Opencv 2.4.11 Java:從質心到輪廓邊線的繪製線
- 16. 找到輪廓後Opencv圖像扭曲
- 17. 輪廓線中輪廓線的平滑度
- 18. 如何判斷obj是jquery還是普通javascript
- 19. OpenCV中如何平滑的輪廓線,降低噪音
- 20. OpenCV - 如何從輪廓中移除小線段?
- 21. OpenCV MATLAB:如何繪製具有特定強度輪廓的線?
- 22. 如何通過曲線
- 23. 如何將輪廓線變成填充的輪廓?
- 24. OpenCV輪廓?
- 25. Opencv輪廓
- 26. OpenCV的:是輪廓封閉或不
- 27. 如何判斷線程是否完成執行而不輪詢ThreadState?
- 28. Google Analytics(分析) - 如何判斷用戶是通過wifi還是cell連接?
- 29. 如何判斷WCF服務是通過HTTP還是HTTPS調用的?
- 30. 如何從Matplotlib格式化輪廓線
在輪廓的第一個點和最後一個點之間定義一條直線,並測量所有其他點與直線的平均距離。如果輪廓是線條,則平均距離接近於0. –
Hi Nico。感謝您的回答。這看起來非常複雜。我想知道是否有更簡單的方法來做到這一點?對不起,我英文很差。 –
你可以做的是用輪廓的第一個和最後一個點進行擬合,並檢查其他點是否落在上面。你不需要檢查所有的點來確定這一點,你可以簡單地選擇每個'第n'點。 –