C++ 如何测量图像中每个极点的长度(以像素为单位)

C++ 如何测量图像中每个极点的长度(以像素为单位),c++,image,opencv,python-imaging-library,C++,Image,Opencv,Python Imaging Library,我想用像素来测量每一个单极的高度和宽度。 但因为杆子并不总是笔直的,但我需要杆子离水平地面的高度。有人能告诉我怎么处理吗 注意:我可能需要得到它以后倾斜的角度。我不确定我能在这里问这么多问题。但如果有人能帮忙,我将不胜感激 我拥有的图像样本位于以下链接: 这会给你一个好主意: #!/usr/local/bin/python3 import cv2 # Open image in greyscale mode img = cv2.imread('poles.png',cv2.IMREAD_GRA

我想用像素来测量每一个单极的高度和宽度。 但因为杆子并不总是笔直的,但我需要杆子离水平地面的高度。有人能告诉我怎么处理吗

注意:我可能需要得到它以后倾斜的角度。我不确定我能在这里问这么多问题。但如果有人能帮忙,我将不胜感激

我拥有的图像样本位于以下链接:


这会给你一个好主意:

#!/usr/local/bin/python3
import cv2

# Open image in greyscale mode
img = cv2.imread('poles.png',cv2.IMREAD_GRAYSCALE)

# Threshold image to pure black and white AND INVERT because findContours looks for WHITE objects on black background
_, thresh = cv2.threshold(img,127,255,cv2.THRESH_BINARY_INV)

# Find contours
_, contours, _ = cv2.findContours(thresh,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)

# Print the contours 
for c in contours:
   x,y,w,h = cv2.boundingRect(c)  
   print(x,y,w,h)
输出如下,其中每行对应于图像中的一个垂直条:

841 334 134 154   <--- bar 6 is 154 pixels tall
190 148 93 340    <--- bar 2 is 340 pixels tall
502 79 93 409     <--- bar 4 is 409 pixels tall
633 55 169 433    <--- bar 5 is 433 pixels tall
1009 48 93 440    <--- bar 7 is 490 pixels tall
348 48 93 440     <--- bar 3 is 440 pixels tall
46 46 93 442      <--- bar 1 is 442 pixels tall (leftmost bar)
输出

Objects (id: bounding-box centroid area mean-color):
  0: 1270x488+0+0 697.8,216.0 372566 srgb(255,255,255)
  1: 93x442+46+46 92.0,266.5 41106 srgb(0,0,0)
  2: 93x440+348+48 394.0,267.5 40920 srgb(0,0,0)
  3: 93x440+1009+48 1055.0,267.5 40920 srgb(0,0,0)
  4: 169x433+633+55 717.3,271.0 40269 srgb(0,0,0)
  5: 93x409+502+79 548.0,283.0 38037 srgb(0,0,0)
  6: 93x340+190+148 236.0,317.5 31620 srgb(0,0,0)
  7: 134x154+841+334 907.4,410.5 14322 srgb(0,0,0)
这将为您提供一个标题行,它告诉您所有字段是什么,然后为它在图像中找到的每个blob提供一行。忽略第一个,因为它是白色背景-您可以从最后一个字段中看到它,即
rgb(255255255)


因此,如果我们看最后一行,它是一个134像素宽、154像素高的斑点,从左上角的x=841和y=334开始,即它对应于OpenCV找到的第一个轮廓。

可以使用阈值,然后是cv::findContours和cv::Minarealect和/或cv::BoundingBox这是否包括获取红色箭头列的高度?还是只是黑条?Mark在下面显示的ImageMagick结果是边界框。因此,具有的倾斜边界框的宽度大于厚度。一种获得黑色条纹宽度的方法是,取一个1像素高的图像水平切片,然后使用连接的组件测量其宽度。只有黑色条纹。红色箭头只是一个指示器。我的回答解决了你的问题吗?如果是这样,请考虑接受它作为您的答案-点击空心蜱/支票旁边的选票计数。如果没有,请说出什么不起作用,以便我或其他人可以进一步帮助您。谢谢哦,谢谢!实际上我用的是C++。一旦我尝试了,我会提供反馈。感谢您宝贵的时间回复。在C++中,我尝试这样写:(int i=0;i <轮廓2),i + + {边界}[I]=Engulink Ret(Mat(CurrsSouthPy[i]));不确定如何写它与x、y、w、h=cv2相同。代码>请参见此处和
Objects (id: bounding-box centroid area mean-color):
  0: 1270x488+0+0 697.8,216.0 372566 srgb(255,255,255)
  1: 93x442+46+46 92.0,266.5 41106 srgb(0,0,0)
  2: 93x440+348+48 394.0,267.5 40920 srgb(0,0,0)
  3: 93x440+1009+48 1055.0,267.5 40920 srgb(0,0,0)
  4: 169x433+633+55 717.3,271.0 40269 srgb(0,0,0)
  5: 93x409+502+79 548.0,283.0 38037 srgb(0,0,0)
  6: 93x340+190+148 236.0,317.5 31620 srgb(0,0,0)
  7: 134x154+841+334 907.4,410.5 14322 srgb(0,0,0)