0
A
回答
1
用戶可以:
- 找到每個連接的組件,與
findContours
- 找到每個連接的組件的最小方向包圍盒,具有
minAreaRect
- 畫線(平行於最長的一邊)通過中心。
結果:
既然你提到:
我想每個 「斑點」 減少到與屬性1)長度爲2)的質心3的對象)角度
我把一些功能封裝到類Blob
。代碼如下:
#include <opencv2/opencv.hpp>
#include <vector>
using namespace std;
using namespace cv;
struct Blob
{
float _length;
Point2f _centroid;
float _angle;
Blob(float length, const Point2f& centroid, float angle) :
_length(length), _centroid(centroid), _angle(angle) {};
Blob(const Blob& other) :
_length(other._length), _centroid(other._centroid), _angle(other._angle) {};
Blob(const RotatedRect& r)
{
_centroid = r.center;
_angle = r.angle*CV_PI/180.;
_length = r.size.height;
if (r.size.width >= r.size.height)
{
_angle = (CV_PI/2.0) + _angle;
_length = r.size.width;
}
}
void draw(const Mat3b& img)
{
// Draw line
Point2f p1, p2;
float b = (float)cos(_angle)*0.5f;
float a = (float)sin(_angle)*0.5f;
p1.x = _centroid.x - a*_length;
p1.y = _centroid.y + b*_length;
p2.x = _centroid.x + a*_length;
p2.y = _centroid.y - b*_length;
line(img, p1, p2, Scalar(0,0,255));
};
};
int main()
{
Mat1b img = imread("path_to_image", IMREAD_GRAYSCALE);
// Apply a threshold to remove JPEG artifacts
Mat1b img2 = img > 200;
// Prepare output image
Mat3b result;
cvtColor(img, result, COLOR_GRAY2BGR);
// Apply a small border to take care of blobs on image boundary
copyMakeBorder(img2, img2, 1, 1, 1, 1, BORDER_CONSTANT, Scalar(0));
// Find connected components
vector<vector<Point>> contours;
findContours(img2.clone(), contours, RETR_CCOMP, CHAIN_APPROX_SIMPLE);
// The vector of blobs
vector<Blob> blobs;
for (int i = 0; i < contours.size(); ++i)
{
// Account for border
for (int j = 0; j < contours[i].size(); ++j)
{
contours[i][j] -= Point(1,1);
}
// Find minimum oriented bounding box
RotatedRect r = minAreaRect(contours[i]);
Blob b(r);
b.draw(result);
// Append to blobs
blobs.push_back(b);
}
imshow("Result", result);
waitKey();
return 0;
}
+0
謝謝Mik!這太棒了! – batlike
相關問題
- 1. 查找沿着空間線的像素交叉點的數量
- 2. 使用opencv訪問沿着曲線/路徑的像素
- 3. 沿着曲線繪製動畫圖像
- 4. 沿着曲線路徑放置圖像
- 5. 沿着文字的圖像
- 6. OpenCV:沿着單像素分支搜索像素
- 7. 正弦曲線沿着正弦曲線
- 8. 沿着matplotlib中的曲線的註釋
- 9. Python,tkinter沿着邊模擬運行
- 10. 模擬汽車沿着軌道移動
- 11. 沿着Matplotlib曲線的凹凸
- 12. 沿着MapKit路線的註釋
- 13. 沿着曲線路徑在背景中移動的圖像android
- 14. 沿着Bezier曲線路徑的iPhone移動UI圖像視圖
- 15. Direct2D中的像素着色器渲染沿着中間的錯誤
- 16. 在MapKit中沿着一條弧線創建視覺元素
- 17. 在圖像中擬合線
- 18. 在libGDX中沿着平鋪線閃爍
- 19. 沿着線串繪製文字
- 20. 沿着折線顯示文本標籤
- 21. 沿着一條對角線編程0s
- 22. 紙JS:波浪線,沿着路徑刷
- 23. 如何沿着水平線移動SKSpriteNode
- 24. 沿着直線移動對象
- 25. Java - 使對象沿着劃線
- 26. 沿着在python參數化曲線
- 27. 沿着3d曲線渲染圓形
- 28. 使圖像沿着一條線在java中移動
- 29. 如何使機器人沿着線使用其攝像機
- 30. 像素化照明着色器
你能提供一幅圖像和預期的結果嗎?你想要一條直線嗎?這些線是否需要完全放在blob內? – Miki
(見編輯)。直線很好,我不想做多項式擬合。理想情況下,我想將每個「斑點」減少到具有以下屬性的對象:1)長度2)質心3)角度(相對於x軸)。我希望開發一種隨着時間的推移,隨着這些斑點的增長而開發的工具。 – batlike