简体   繁体   中英

How to calculate euclidean distance between two ndarrays in Python OpenCV

I am trying to calculate the euclidean distance between two images. For this I am first getting the 128d array of the image and then using cv2.norm() to get the distance. Below is the code:

embedder = cv2.dnn.readNetFromTorch(<model_path>)
embedder.setInput(faceBlob)
vec = embedder.forward()
print(vec)

vec_file = pickle.loads(open(args["recognizer"], "rb").read())
known_vec = vec_file.support_vectors_

for embedding in known_vec:
    print(embedding)
    distance = cv2.norm(vec, embedding)

In the above code, I have vec which is coming from an image file and embedding from known_vec . Below is how vec and embedding looks like:

vec:
[[ 1.50953727e-02  2.81099556e-03 -3.50600183e-02 -5.78538561e-03
   2.31029615e-02  1.73964068e-01  3.79475281e-02  1.27083873e-02
  -9.68848541e-02 -1.13846334e-02  1.92795545e-02  7.36472011e-02
   7.79130757e-02 -2.11485863e-01 -6.82436973e-02 -1.64214987e-04
  -2.01231852e-01  2.29396261e-02 -4.34093624e-02  9.49875787e-02
   1.96524531e-01 -1.40022561e-01  1.00606538e-01  3.70812230e-02
  -1.45635298e-02  3.85013111e-02 -8.84107649e-02 -3.15038770e-01
   3.25521380e-02  4.29384746e-02  1.74971391e-02  3.27903479e-02
  -4.76430990e-02  6.02841079e-02  3.60031053e-02 -4.40581292e-02
  -8.15121531e-02  1.46739334e-01  3.19194235e-02 -5.45275658e-02
   3.90344337e-02 -1.47340044e-01 -8.87186751e-02  9.13328975e-02
  -1.33012265e-01 -6.64092153e-02  1.45769000e-01 -4.49066125e-02
  -1.70968711e-01  1.84094254e-02 -1.43186841e-02 -3.82681675e-02
  -9.34342016e-03  3.55955921e-02  6.70149326e-02  1.09950025e-02
   1.09302737e-01  6.81546181e-02 -7.36390129e-02 -1.16702713e-01
  -1.40488185e-02 -2.61708386e-02  2.10996747e-01 -6.54504001e-02
   1.53530702e-01 -8.38626847e-02 -1.86689962e-02 -2.70418124e-03
  -2.32851990e-02  5.15586026e-02 -8.13494101e-02  7.11051449e-02
  -1.19156547e-01  1.64730344e-02  2.14404091e-02 -4.26124930e-02
  -7.58614466e-02  3.41765210e-02  4.33261022e-02  1.71321735e-01
  -1.44580662e-01 -4.46063727e-02  2.88061053e-02  4.15235199e-03
  -1.05133533e-01  1.83968637e-02  1.12521172e-01  5.98449074e-02
   2.27536708e-02 -3.94514054e-02  8.82636383e-02 -8.32060277e-02
  -4.92165126e-02  7.84259290e-03 -1.18784890e-01 -9.60832909e-02
  -4.92453715e-03  1.44542158e-01  3.30348462e-02  2.81231338e-03
   6.14521280e-02 -7.35903298e-03 -7.54322633e-02  1.10058203e-01
   5.87815009e-02  1.78886037e-02 -4.85782837e-03  1.84458613e-01
   3.11982278e-02 -7.37933293e-02 -7.51596317e-02  1.04695961e-01
  -9.72250253e-02 -9.44643840e-02  1.27530798e-01  1.23021275e-01
  -9.76756811e-02 -8.43207240e-02  6.96085840e-02  1.64856598e-01
   2.96653248e-02 -2.89077275e-02 -1.12501364e-02  2.36267108e-03
  -3.10793705e-02  8.10181573e-02  3.76056321e-02  5.94174117e-02]]

embedding:
[ 0.03765839  0.09021743 -0.001356    0.04076054  0.04601533  0.25682124
  0.03684118  0.04658685 -0.0683746   0.0922796   0.04687139 -0.00272194
  0.01932732 -0.16777565  0.06045137 -0.03307288 -0.02232558  0.12863097
  0.06122964 -0.09006073  0.20338912 -0.05094699 -0.05211756  0.07307947
  0.14153366 -0.03110684 -0.11104943 -0.2103712   0.088107    0.09068976
  0.10696387  0.05845631 -0.07577723  0.04438741  0.10031617 -0.02361435
 -0.01955461 -0.08868567  0.11458483 -0.10992806  0.10672607 -0.12679504
  0.01632918  0.07699546 -0.07913689 -0.12192447  0.11415054 -0.0351057
 -0.14725251 -0.13427286  0.10578448  0.06842157  0.01293649 -0.02879749
  0.04028381  0.08853597  0.04816869 -0.01133396 -0.0159949  -0.16353707
 -0.02181644 -0.07351912  0.09002206 -0.15716557  0.09319755 -0.02052106
  0.03212938 -0.03629737 -0.03515568  0.13036096 -0.03792502  0.10754489
 -0.15451996 -0.11948325 -0.04193863 -0.02881463 -0.07436965  0.11885778
  0.0090537   0.10868978 -0.15199617  0.11014692  0.12235526  0.03885943
  0.03852987 -0.01098366  0.10460863  0.01727468  0.04457604  0.01060722
  0.00488355 -0.04175444 -0.10867393  0.00945349 -0.09279638 -0.11769478
  0.03810817  0.09189356 -0.06156022 -0.0081004   0.08123636  0.08515859
  0.0019427   0.05686275 -0.00857953  0.03230546  0.03530128  0.04284313
  0.0120915  -0.00855714 -0.06190326 -0.03082059 -0.13773248 -0.13991699
  0.18191327  0.00246803 -0.08906183 -0.16354702  0.04687581  0.09188556
  0.11612693 -0.06407943  0.01638488 -0.01842222  0.03551267  0.05930701
  0.13821986  0.0852181 ]

When I am trying to do cv2.norm between these two, I am getting below error:

OpenCV(4.2.0) C:\projects\opencv-python\opencv\modules\core\src\norm.cpp:1081: error: (-2:Unspecified error) in function 'double __cdecl cv::norm(const class cv::_InputArray &,const class cv::_InputArray &,int,const class cv::_InputArray &)'
> Input type mismatch (expected: '_src1.type() == _src2.type()'), where
>     '_src1.type()' is 5 (CV_32FC1)
> must be equal to
>     '_src2.type()' is 6 (CV_64FC1)

I am not very experienced in cv2.norm and ndarray . Can anyone please help and suggest some good solutions to calculate the euclidean distance. Please help. Thanks

cv2.norm expects the shape of both the arguments to be the same. When you make the call to the function, your two inputs have different shapes. To overcome the problem, you need to reshape one to the same shape as the second.

# vec.shape (1,128) This means vec is a 2d array, with 128 values in ist row
# embedding.shape (128,) This mean embedding is a 1d array of 128 values

embedding = np.reshape(embedding, (1,128))
# embedding.shape (1,128) same as vec
distance = cv2.norm(vec, embedding)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM