S Andrew
S Andrew

Reputation: 7198

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

Upvotes: 0

Views: 2074

Answers (1)

mibrahimy
mibrahimy

Reputation: 732

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)

Upvotes: 2

Related Questions