How to calculate the distance between the objects in the image with Python

Today I want to show you how to calculate the distance between the objects in the image. We will write an awesome algorithm that you can modify and extend to your needs.

This is our test image:

Let’s jump to the code!

First, we need to import the necessary packages:

<span>from</span> <span>scipy.spatial</span> <span>import</span> <span>distance</span> <span>as</span> <span>dist</span>
<span>from</span> <span>imutils</span> <span>import</span> <span>perspective</span>
<span>from</span> <span>imutils</span> <span>import</span> <span>contours</span>
<span>import</span> <span>numpy</span> <span>as</span> <span>np</span>
<span>import</span> <span>argparse</span>
<span>import</span> <span>imutils</span>
<span>import</span> <span>cv2</span>
<span>from</span> <span>scipy.spatial</span> <span>import</span> <span>distance</span> <span>as</span> <span>dist</span>
<span>from</span> <span>imutils</span> <span>import</span> <span>perspective</span>
<span>from</span> <span>imutils</span> <span>import</span> <span>contours</span>
<span>import</span> <span>numpy</span> <span>as</span> <span>np</span>
<span>import</span> <span>argparse</span>
<span>import</span> <span>imutils</span>
<span>import</span> <span>cv2</span>
from scipy.spatial import distance as dist from imutils import perspective from imutils import contours import numpy as np import argparse import imutils import cv2

Enter fullscreen mode Exit fullscreen mode

Then we construct the argument parse and parse the arguments

<span>def</span> <span>midpoint</span><span>(</span><span>ptA</span><span>,</span> <span>ptB</span><span>):</span>
<span>return </span><span>((</span><span>ptA</span><span>[</span><span>0</span><span>]</span> <span>+</span> <span>ptB</span><span>[</span><span>0</span><span>])</span> <span>*</span> <span>0.5</span><span>,</span> <span>(</span><span>ptA</span><span>[</span><span>1</span><span>]</span> <span>+</span> <span>ptB</span><span>[</span><span>1</span><span>])</span> <span>*</span> <span>0.5</span><span>)</span>
<span>def</span> <span>midpoint</span><span>(</span><span>ptA</span><span>,</span> <span>ptB</span><span>):</span>
    <span>return </span><span>((</span><span>ptA</span><span>[</span><span>0</span><span>]</span> <span>+</span> <span>ptB</span><span>[</span><span>0</span><span>])</span> <span>*</span> <span>0.5</span><span>,</span> <span>(</span><span>ptA</span><span>[</span><span>1</span><span>]</span> <span>+</span> <span>ptB</span><span>[</span><span>1</span><span>])</span> <span>*</span> <span>0.5</span><span>)</span>
def midpoint(ptA, ptB): return ((ptA[0] + ptB[0]) * 0.5, (ptA[1] + ptB[1]) * 0.5)

Enter fullscreen mode Exit fullscreen mode

after that we load the image, convert it to grayscale:

<span>image</span> <span>=</span> <span>cv2</span><span>.</span><span>imread</span><span>(</span><span>'</span><span>images/test.jpg</span><span>'</span><span>)</span>
<span>gray</span> <span>=</span> <span>cv2</span><span>.</span><span>cvtColor</span><span>(</span><span>image</span><span>,</span> <span>cv2</span><span>.</span><span>COLOR_BGR2GRAY</span><span>)</span>
<span>gray</span> <span>=</span> <span>cv2</span><span>.</span><span>GaussianBlur</span><span>(</span><span>gray</span><span>,</span> <span>(</span><span>7</span><span>,</span> <span>7</span><span>),</span> <span>0</span><span>)</span>
<span>image</span> <span>=</span> <span>cv2</span><span>.</span><span>imread</span><span>(</span><span>'</span><span>images/test.jpg</span><span>'</span><span>)</span>
<span>gray</span> <span>=</span> <span>cv2</span><span>.</span><span>cvtColor</span><span>(</span><span>image</span><span>,</span> <span>cv2</span><span>.</span><span>COLOR_BGR2GRAY</span><span>)</span>
<span>gray</span> <span>=</span> <span>cv2</span><span>.</span><span>GaussianBlur</span><span>(</span><span>gray</span><span>,</span> <span>(</span><span>7</span><span>,</span> <span>7</span><span>),</span> <span>0</span><span>)</span>
image = cv2.imread('images/test.jpg') gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) gray = cv2.GaussianBlur(gray, (7, 7), 0)

Enter fullscreen mode Exit fullscreen mode

then we perform edge detection and close gaps in between object edges:

<span>edged</span> <span>=</span> <span>cv2</span><span>.</span><span>Canny</span><span>(</span><span>gray</span><span>,</span> <span>50</span><span>,</span> <span>100</span><span>)</span>
<span>edged</span> <span>=</span> <span>cv2</span><span>.</span><span>dilate</span><span>(</span><span>edged</span><span>,</span> <span>None</span><span>,</span> <span>iterations</span><span>=</span><span>1</span><span>)</span>
<span>edged</span> <span>=</span> <span>cv2</span><span>.</span><span>erode</span><span>(</span><span>edged</span><span>,</span> <span>None</span><span>,</span> <span>iterations</span><span>=</span><span>1</span><span>)</span>
<span>edged</span> <span>=</span> <span>cv2</span><span>.</span><span>Canny</span><span>(</span><span>gray</span><span>,</span> <span>50</span><span>,</span> <span>100</span><span>)</span>
<span>edged</span> <span>=</span> <span>cv2</span><span>.</span><span>dilate</span><span>(</span><span>edged</span><span>,</span> <span>None</span><span>,</span> <span>iterations</span><span>=</span><span>1</span><span>)</span>
<span>edged</span> <span>=</span> <span>cv2</span><span>.</span><span>erode</span><span>(</span><span>edged</span><span>,</span> <span>None</span><span>,</span> <span>iterations</span><span>=</span><span>1</span><span>)</span>
edged = cv2.Canny(gray, 50, 100) edged = cv2.dilate(edged, None, iterations=1) edged = cv2.erode(edged, None, iterations=1)

Enter fullscreen mode Exit fullscreen mode

find contours in the edge map

<span>cnts</span> <span>=</span> <span>cv2</span><span>.</span><span>findContours</span><span>(</span><span>edged</span><span>.</span><span>copy</span><span>(),</span> <span>cv2</span><span>.</span><span>RETR_EXTERNAL</span><span>,</span>
<span>cv2</span><span>.</span><span>CHAIN_APPROX_SIMPLE</span><span>)</span>
<span>cnts</span> <span>=</span> <span>imutils</span><span>.</span><span>grab_contours</span><span>(</span><span>cnts</span><span>)</span>
<span>cnts</span> <span>=</span> <span>cv2</span><span>.</span><span>findContours</span><span>(</span><span>edged</span><span>.</span><span>copy</span><span>(),</span> <span>cv2</span><span>.</span><span>RETR_EXTERNAL</span><span>,</span>
                        <span>cv2</span><span>.</span><span>CHAIN_APPROX_SIMPLE</span><span>)</span>
<span>cnts</span> <span>=</span> <span>imutils</span><span>.</span><span>grab_contours</span><span>(</span><span>cnts</span><span>)</span>
cnts = cv2.findContours(edged.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) cnts = imutils.grab_contours(cnts)

Enter fullscreen mode Exit fullscreen mode

then initialize the distance colors and reference object:

<span>(</span><span>cnts</span><span>,</span> <span>_</span><span>)</span> <span>=</span> <span>contours</span><span>.</span><span>sort_contours</span><span>(</span><span>cnts</span><span>)</span>
<span>colors</span> <span>=</span> <span>((</span><span>0</span><span>,</span> <span>0</span><span>,</span> <span>255</span><span>),</span> <span>(</span><span>240</span><span>,</span> <span>0</span><span>,</span> <span>159</span><span>),</span> <span>(</span><span>0</span><span>,</span> <span>165</span><span>,</span> <span>255</span><span>),</span> <span>(</span><span>255</span><span>,</span> <span>255</span><span>,</span> <span>0</span><span>),</span>
<span>(</span><span>255</span><span>,</span> <span>0</span><span>,</span> <span>255</span><span>))</span>
<span>refObj</span> <span>=</span> <span>None</span>
<span>(</span><span>cnts</span><span>,</span> <span>_</span><span>)</span> <span>=</span> <span>contours</span><span>.</span><span>sort_contours</span><span>(</span><span>cnts</span><span>)</span>
<span>colors</span> <span>=</span> <span>((</span><span>0</span><span>,</span> <span>0</span><span>,</span> <span>255</span><span>),</span> <span>(</span><span>240</span><span>,</span> <span>0</span><span>,</span> <span>159</span><span>),</span> <span>(</span><span>0</span><span>,</span> <span>165</span><span>,</span> <span>255</span><span>),</span> <span>(</span><span>255</span><span>,</span> <span>255</span><span>,</span> <span>0</span><span>),</span>
          <span>(</span><span>255</span><span>,</span> <span>0</span><span>,</span> <span>255</span><span>))</span>
<span>refObj</span> <span>=</span> <span>None</span>
(cnts, _) = contours.sort_contours(cnts) colors = ((0, 0, 255), (240, 0, 159), (0, 165, 255), (255, 255, 0), (255, 0, 255)) refObj = None

Enter fullscreen mode Exit fullscreen mode

then we loop over the contours individually:

<span>for</span> <span>c</span> <span>in</span> <span>cnts</span><span>:</span>
<span>if</span> <span>cv2</span><span>.</span><span>contourArea</span><span>(</span><span>c</span><span>)</span> <span><</span> <span>100</span><span>:</span>
<span>continue</span>
<span>box</span> <span>=</span> <span>cv2</span><span>.</span><span>minAreaRect</span><span>(</span><span>c</span><span>)</span>
<span>box</span> <span>=</span> <span>cv2</span><span>.</span><span>cv</span><span>.</span><span>BoxPoints</span><span>(</span><span>box</span><span>)</span> <span>if</span> <span>imutils</span><span>.</span><span>is_cv2</span><span>()</span> <span>else</span> <span>cv2</span><span>.</span><span>boxPoints</span><span>(</span><span>box</span><span>)</span>
<span>box</span> <span>=</span> <span>np</span><span>.</span><span>array</span><span>(</span><span>box</span><span>,</span> <span>dtype</span><span>=</span><span>"</span><span>int</span><span>"</span><span>)</span>
<span>box</span> <span>=</span> <span>perspective</span><span>.</span><span>order_points</span><span>(</span><span>box</span><span>)</span>
<span>cX</span> <span>=</span> <span>np</span><span>.</span><span>average</span><span>(</span><span>box</span><span>[:,</span> <span>0</span><span>])</span>
<span>cY</span> <span>=</span> <span>np</span><span>.</span><span>average</span><span>(</span><span>box</span><span>[:,</span> <span>1</span><span>])</span>
<span>if</span> <span>refObj</span> <span>is</span> <span>None</span><span>:</span>
<span>(</span><span>tl</span><span>,</span> <span>tr</span><span>,</span> <span>br</span><span>,</span> <span>bl</span><span>)</span> <span>=</span> <span>box</span>
<span>(</span><span>tlblX</span><span>,</span> <span>tlblY</span><span>)</span> <span>=</span> <span>midpoint</span><span>(</span><span>tl</span><span>,</span> <span>bl</span><span>)</span>
<span>(</span><span>trbrX</span><span>,</span> <span>trbrY</span><span>)</span> <span>=</span> <span>midpoint</span><span>(</span><span>tr</span><span>,</span> <span>br</span><span>)</span>
<span>D</span> <span>=</span> <span>dist</span><span>.</span><span>euclidean</span><span>((</span><span>tlblX</span><span>,</span> <span>tlblY</span><span>),</span> <span>(</span><span>trbrX</span><span>,</span> <span>trbrY</span><span>))</span>
<span>refObj</span> <span>=</span> <span>(</span><span>box</span><span>,</span> <span>(</span><span>cX</span><span>,</span> <span>cY</span><span>),</span> <span>D</span> <span>/</span> <span>70</span><span>)</span>
<span>continue</span>
<span>orig</span> <span>=</span> <span>image</span><span>.</span><span>copy</span><span>()</span>
<span>cv2</span><span>.</span><span>drawContours</span><span>(</span><span>orig</span><span>,</span> <span>[</span><span>box</span><span>.</span><span>astype</span><span>(</span><span>"</span><span>int</span><span>"</span><span>)],</span> <span>-</span><span>1</span><span>,</span> <span>(</span><span>0</span><span>,</span> <span>255</span><span>,</span> <span>0</span><span>),</span> <span>2</span><span>)</span>
<span>cv2</span><span>.</span><span>drawContours</span><span>(</span><span>orig</span><span>,</span> <span>[</span><span>refObj</span><span>[</span><span>0</span><span>].</span><span>astype</span><span>(</span><span>"</span><span>int</span><span>"</span><span>)],</span> <span>-</span><span>1</span><span>,</span> <span>(</span><span>0</span><span>,</span> <span>255</span><span>,</span> <span>0</span><span>),</span> <span>2</span><span>)</span>
<span>refCoords</span> <span>=</span> <span>np</span><span>.</span><span>vstack</span><span>([</span><span>refObj</span><span>[</span><span>0</span><span>],</span> <span>refObj</span><span>[</span><span>1</span><span>]])</span>
<span>objCoords</span> <span>=</span> <span>np</span><span>.</span><span>vstack</span><span>([</span><span>box</span><span>,</span> <span>(</span><span>cX</span><span>,</span> <span>cY</span><span>)])</span>
<span>for</span> <span>c</span> <span>in</span> <span>cnts</span><span>:</span>
    <span>if</span> <span>cv2</span><span>.</span><span>contourArea</span><span>(</span><span>c</span><span>)</span> <span><</span> <span>100</span><span>:</span>
        <span>continue</span>
    <span>box</span> <span>=</span> <span>cv2</span><span>.</span><span>minAreaRect</span><span>(</span><span>c</span><span>)</span>
    <span>box</span> <span>=</span> <span>cv2</span><span>.</span><span>cv</span><span>.</span><span>BoxPoints</span><span>(</span><span>box</span><span>)</span> <span>if</span> <span>imutils</span><span>.</span><span>is_cv2</span><span>()</span> <span>else</span> <span>cv2</span><span>.</span><span>boxPoints</span><span>(</span><span>box</span><span>)</span>
    <span>box</span> <span>=</span> <span>np</span><span>.</span><span>array</span><span>(</span><span>box</span><span>,</span> <span>dtype</span><span>=</span><span>"</span><span>int</span><span>"</span><span>)</span>
    <span>box</span> <span>=</span> <span>perspective</span><span>.</span><span>order_points</span><span>(</span><span>box</span><span>)</span>
    <span>cX</span> <span>=</span> <span>np</span><span>.</span><span>average</span><span>(</span><span>box</span><span>[:,</span> <span>0</span><span>])</span>
    <span>cY</span> <span>=</span> <span>np</span><span>.</span><span>average</span><span>(</span><span>box</span><span>[:,</span> <span>1</span><span>])</span>
    <span>if</span> <span>refObj</span> <span>is</span> <span>None</span><span>:</span>
        <span>(</span><span>tl</span><span>,</span> <span>tr</span><span>,</span> <span>br</span><span>,</span> <span>bl</span><span>)</span> <span>=</span> <span>box</span>
        <span>(</span><span>tlblX</span><span>,</span> <span>tlblY</span><span>)</span> <span>=</span> <span>midpoint</span><span>(</span><span>tl</span><span>,</span> <span>bl</span><span>)</span>
        <span>(</span><span>trbrX</span><span>,</span> <span>trbrY</span><span>)</span> <span>=</span> <span>midpoint</span><span>(</span><span>tr</span><span>,</span> <span>br</span><span>)</span>
        <span>D</span> <span>=</span> <span>dist</span><span>.</span><span>euclidean</span><span>((</span><span>tlblX</span><span>,</span> <span>tlblY</span><span>),</span> <span>(</span><span>trbrX</span><span>,</span> <span>trbrY</span><span>))</span>
        <span>refObj</span> <span>=</span> <span>(</span><span>box</span><span>,</span> <span>(</span><span>cX</span><span>,</span> <span>cY</span><span>),</span> <span>D</span> <span>/</span> <span>70</span><span>)</span>
        <span>continue</span>
    <span>orig</span> <span>=</span> <span>image</span><span>.</span><span>copy</span><span>()</span>
    <span>cv2</span><span>.</span><span>drawContours</span><span>(</span><span>orig</span><span>,</span> <span>[</span><span>box</span><span>.</span><span>astype</span><span>(</span><span>"</span><span>int</span><span>"</span><span>)],</span> <span>-</span><span>1</span><span>,</span> <span>(</span><span>0</span><span>,</span> <span>255</span><span>,</span> <span>0</span><span>),</span> <span>2</span><span>)</span>
    <span>cv2</span><span>.</span><span>drawContours</span><span>(</span><span>orig</span><span>,</span> <span>[</span><span>refObj</span><span>[</span><span>0</span><span>].</span><span>astype</span><span>(</span><span>"</span><span>int</span><span>"</span><span>)],</span> <span>-</span><span>1</span><span>,</span> <span>(</span><span>0</span><span>,</span> <span>255</span><span>,</span> <span>0</span><span>),</span> <span>2</span><span>)</span>
    <span>refCoords</span> <span>=</span> <span>np</span><span>.</span><span>vstack</span><span>([</span><span>refObj</span><span>[</span><span>0</span><span>],</span> <span>refObj</span><span>[</span><span>1</span><span>]])</span>
    <span>objCoords</span> <span>=</span> <span>np</span><span>.</span><span>vstack</span><span>([</span><span>box</span><span>,</span> <span>(</span><span>cX</span><span>,</span> <span>cY</span><span>)])</span>
for c in cnts: if cv2.contourArea(c) < 100: continue box = cv2.minAreaRect(c) box = cv2.cv.BoxPoints(box) if imutils.is_cv2() else cv2.boxPoints(box) box = np.array(box, dtype="int") box = perspective.order_points(box) cX = np.average(box[:, 0]) cY = np.average(box[:, 1]) if refObj is None: (tl, tr, br, bl) = box (tlblX, tlblY) = midpoint(tl, bl) (trbrX, trbrY) = midpoint(tr, br) D = dist.euclidean((tlblX, tlblY), (trbrX, trbrY)) refObj = (box, (cX, cY), D / 70) continue orig = image.copy() cv2.drawContours(orig, [box.astype("int")], -1, (0, 255, 0), 2) cv2.drawContours(orig, [refObj[0].astype("int")], -1, (0, 255, 0), 2) refCoords = np.vstack([refObj[0], refObj[1]]) objCoords = np.vstack([box, (cX, cY)])

Enter fullscreen mode Exit fullscreen mode

then we loop over the original points:

<span>for </span><span>((</span><span>xA</span><span>,</span> <span>yA</span><span>),</span> <span>(</span><span>xB</span><span>,</span> <span>yB</span><span>),</span> <span>color</span><span>)</span> <span>in</span> <span>zip</span><span>(</span><span>refCoords</span><span>,</span> <span>objCoords</span><span>,</span> <span>colors</span><span>):</span>
<span>cv2</span><span>.</span><span>circle</span><span>(</span><span>orig</span><span>,</span> <span>(</span><span>int</span><span>(</span><span>xA</span><span>),</span> <span>int</span><span>(</span><span>yA</span><span>)),</span> <span>5</span><span>,</span> <span>color</span><span>,</span> <span>-</span><span>1</span><span>)</span>
<span>cv2</span><span>.</span><span>circle</span><span>(</span><span>orig</span><span>,</span> <span>(</span><span>int</span><span>(</span><span>xB</span><span>),</span> <span>int</span><span>(</span><span>yB</span><span>)),</span> <span>5</span><span>,</span> <span>color</span><span>,</span> <span>-</span><span>1</span><span>)</span>
<span>cv2</span><span>.</span><span>line</span><span>(</span><span>orig</span><span>,</span> <span>(</span><span>int</span><span>(</span><span>xA</span><span>),</span> <span>int</span><span>(</span><span>yA</span><span>)),</span> <span>(</span><span>int</span><span>(</span><span>xB</span><span>),</span> <span>int</span><span>(</span><span>yB</span><span>)),</span>
<span>color</span><span>,</span> <span>2</span><span>)</span>
<span>D</span> <span>=</span> <span>dist</span><span>.</span><span>euclidean</span><span>((</span><span>xA</span><span>,</span> <span>yA</span><span>),</span> <span>(</span><span>xB</span><span>,</span> <span>yB</span><span>))</span> <span>/</span> <span>refObj</span><span>[</span><span>2</span><span>]</span>
<span>(</span><span>mX</span><span>,</span> <span>mY</span><span>)</span> <span>=</span> <span>midpoint</span><span>((</span><span>xA</span><span>,</span> <span>yA</span><span>),</span> <span>(</span><span>xB</span><span>,</span> <span>yB</span><span>))</span>
<span>cv2</span><span>.</span><span>putText</span><span>(</span><span>orig</span><span>,</span> <span>"</span><span>{:.1f}in</span><span>"</span><span>.</span><span>format</span><span>(</span><span>D</span><span>),</span> <span>(</span><span>int</span><span>(</span><span>mX</span><span>),</span> <span>int</span><span>(</span><span>mY</span> <span>-</span> <span>10</span><span>)),</span>
<span>cv2</span><span>.</span><span>FONT_HERSHEY_SIMPLEX</span><span>,</span> <span>0.55</span><span>,</span> <span>color</span><span>,</span> <span>2</span><span>)</span>
<span>cv2</span><span>.</span><span>imshow</span><span>(</span><span>"</span><span>Image</span><span>"</span><span>,</span> <span>orig</span><span>)</span>
<span>cv2</span><span>.</span><span>waitKey</span><span>(</span><span>0</span><span>)</span>
<span>cv2</span><span>.</span><span>destroyAllWindows</span><span>()</span>
<span>for </span><span>((</span><span>xA</span><span>,</span> <span>yA</span><span>),</span> <span>(</span><span>xB</span><span>,</span> <span>yB</span><span>),</span> <span>color</span><span>)</span> <span>in</span> <span>zip</span><span>(</span><span>refCoords</span><span>,</span> <span>objCoords</span><span>,</span> <span>colors</span><span>):</span>
        <span>cv2</span><span>.</span><span>circle</span><span>(</span><span>orig</span><span>,</span> <span>(</span><span>int</span><span>(</span><span>xA</span><span>),</span> <span>int</span><span>(</span><span>yA</span><span>)),</span> <span>5</span><span>,</span> <span>color</span><span>,</span> <span>-</span><span>1</span><span>)</span>
        <span>cv2</span><span>.</span><span>circle</span><span>(</span><span>orig</span><span>,</span> <span>(</span><span>int</span><span>(</span><span>xB</span><span>),</span> <span>int</span><span>(</span><span>yB</span><span>)),</span> <span>5</span><span>,</span> <span>color</span><span>,</span> <span>-</span><span>1</span><span>)</span>
        <span>cv2</span><span>.</span><span>line</span><span>(</span><span>orig</span><span>,</span> <span>(</span><span>int</span><span>(</span><span>xA</span><span>),</span> <span>int</span><span>(</span><span>yA</span><span>)),</span> <span>(</span><span>int</span><span>(</span><span>xB</span><span>),</span> <span>int</span><span>(</span><span>yB</span><span>)),</span>
                 <span>color</span><span>,</span> <span>2</span><span>)</span>
        <span>D</span> <span>=</span> <span>dist</span><span>.</span><span>euclidean</span><span>((</span><span>xA</span><span>,</span> <span>yA</span><span>),</span> <span>(</span><span>xB</span><span>,</span> <span>yB</span><span>))</span> <span>/</span> <span>refObj</span><span>[</span><span>2</span><span>]</span>
        <span>(</span><span>mX</span><span>,</span> <span>mY</span><span>)</span> <span>=</span> <span>midpoint</span><span>((</span><span>xA</span><span>,</span> <span>yA</span><span>),</span> <span>(</span><span>xB</span><span>,</span> <span>yB</span><span>))</span>
        <span>cv2</span><span>.</span><span>putText</span><span>(</span><span>orig</span><span>,</span> <span>"</span><span>{:.1f}in</span><span>"</span><span>.</span><span>format</span><span>(</span><span>D</span><span>),</span> <span>(</span><span>int</span><span>(</span><span>mX</span><span>),</span> <span>int</span><span>(</span><span>mY</span> <span>-</span> <span>10</span><span>)),</span>
                    <span>cv2</span><span>.</span><span>FONT_HERSHEY_SIMPLEX</span><span>,</span> <span>0.55</span><span>,</span> <span>color</span><span>,</span> <span>2</span><span>)</span>
        <span>cv2</span><span>.</span><span>imshow</span><span>(</span><span>"</span><span>Image</span><span>"</span><span>,</span> <span>orig</span><span>)</span>
        <span>cv2</span><span>.</span><span>waitKey</span><span>(</span><span>0</span><span>)</span>
<span>cv2</span><span>.</span><span>destroyAllWindows</span><span>()</span>
for ((xA, yA), (xB, yB), color) in zip(refCoords, objCoords, colors): cv2.circle(orig, (int(xA), int(yA)), 5, color, -1) cv2.circle(orig, (int(xB), int(yB)), 5, color, -1) cv2.line(orig, (int(xA), int(yA)), (int(xB), int(yB)), color, 2) D = dist.euclidean((xA, yA), (xB, yB)) / refObj[2] (mX, mY) = midpoint((xA, yA), (xB, yB)) cv2.putText(orig, "{:.1f}in".format(D), (int(mX), int(mY - 10)), cv2.FONT_HERSHEY_SIMPLEX, 0.55, color, 2) cv2.imshow("Image", orig) cv2.waitKey(0) cv2.destroyAllWindows()

Enter fullscreen mode Exit fullscreen mode

This is our final result:

Thank you all.

原文链接:How to calculate the distance between the objects in the image with Python

© 版权声明
THE END
喜欢就支持一下吧
点赞13 分享
Happiness is not something you postpone for the future; it is something you design for the present.
幸福不应该留到未来品尝,幸福是你专门为当下的自己所准备的
评论 抢沙发

请登录后发表评论

    暂无评论内容