计算图像中对象的中心

时间:2019-01-27 13:49:59

标签: python opencv computer-vision hough-transform

我正在阅读此post,以使用 Window window(720, 720, "Window"); Shader shader("shader.vert", "shader.frag"); glm::mat4 model = glm::mat4(1.0); shader.setUniformmat4("model", model); Renderer* renderer = new Renderer(); std::vector<StaticSprite*> sprites; sprites.push_back(new StaticSprite(-0.5, -0.5, 0.0, 1.0, 1.0, glm::vec4(1.0, 1.0, 0.0, 1.0), &shader)); while (!window.closed()) { window.clear(); shader.enable(); double x, y; window.getMousePosition(x, y); shader.setUniformvec2("light_pos", glm::vec2((x / window.getWidth()) * 2.0 - 1.0, 1.0 - 2.0 * (y / window.getHeight()))); for (StaticSprite* sprite : sprites) renderer->submit(sprite); renderer->flush(); shader.disable(); window.update(); } return 0; 使用OpenCV来计算图像的中心。但是我正在尝试计算使用HoughLinesP检测到的对象的中心。 OpenCV有办法做到这一点吗?

这是我要为其计算中心的图像。

enter image description here

找到线段,输出图像如下:

enter image description here

Moments

使用坐标如何计算该图像的中心?如何在这里使用import cv2 import numpy as np import math img = cv2.imread("./images/octa.jpg") b,g,r = cv2.split(img) smoothed = cv2.GaussianBlur(g, (3,3), 0) edges = cv2.Canny(smoothed, 15, 60, apertureSize = 3) lines = cv2.HoughLinesP(edges,1,np.pi/180,35, 30, 20) print("length of lines detected ", lines.shape) for line in lines: for x1,y1,x2,y2 in line: cv2.line(img,(x1,y1),(x2,y2),(255,0,0),2) print("x1,y1", x1,",",y1, " --- ", "x2,y2", x2,",",y2) cv2.imshow('detected',img) cv2.waitKey(0) cv2.destroyAllWindows()

我的一个限制是我不能使用Moments附带的Contour方法。

1 个答案:

答案 0 :(得分:0)

以下代码与cv2的{​​{1}}版本一起使用。

我密切关注opencv docs,它运行良好。

3.3.1

两个注意事项:

  • 您需要将参数import cv2 img = cv2.imread("octa.jpg", 0) ret,thresh = cv2.threshold(img,100,255,0) im2, contours, hierachy = cv2.findContours(thresh, 1, 2) cnt = contours[0] M = cv2.moments(cnt) cx = int(M['m10']/M['m00']) cy = int(M['m01']/M['m00']) im2 = cv2.cvtColor(im2, cv2.COLOR_GRAY2RGB) cv2.polylines(im2, cnt, True, (0, 0, 255), 2) cv2.circle(im2, (cx, cy), 5, (0, 0, 255), 1) cv2.imshow("res", im2) 添加到0,否则轮廓查找将不起作用
  • 我将阈值设置得低一点,所以只找到了八边形的轮廓

结果:

result

如果您使用imread的其他版本,则只需将文档更改为您的版本即可;文档真的很好。

您可能还想稍微模糊图像或进行其他一些预处理,但是在这种情况下,不需要使用图像。

编辑,不带轮廓:

我从this post那里获得了有用的评论,并做了一些修改。这不使用轮廓。它找到线并用它们找到中心

cv2

结果: enter image description here 找到的线用蓝色绘制;红色的中心