Opencvでのマット行列の乗算-ドット積、ドット、マルチ演算



Multiplication Mat Matrix Opencv Dot Product



転載: https://blog.csdn.net/dcrmg/article/details/52404580





Opencvでは、mulは2つのMat行列の対応するビットの積を計算するため、操作に関与する行列AとBの行と列の数が同じである必要があります。計算結果は、AまたはBと同じ行数または列数のマット行列です。




Opencvのmulステートメント:




  1. //! per-element matrix multiplication by means of matrix expressions
  2. MatExpr mul(InputArray m, double scale=1) const


簡単なケースを例にとると、2 * 2サイズのマット行列AおよびBの場合:


AとBでmul操作を実行します。



mulの説明:


1.1。 mul操作には、操作に参加する2つの行列AとBのデータ型要件はありませんが、AとBの型が同じである必要があります。そうでない場合、エラーが報告されます。

二。 マットAB = A.mul(B)、 ABを宣言するときにABデータ型が定義されていない場合、デフォルトのABデータ型はAおよびBと同じです。

3.3。 AB精度が不十分な場合、オーバーフローが発生する可能性があり、オーバーフロー値は現在の精度で最大値に設定されます。


Opencv検証:


  1. #include 'core/core.hpp'
  2. #include 'iostream'
  3. using namespace std
  4. using namespace cv
  5. int main(int argc,char *argv[])
  6. {
  7. Mat A=Mat::ones(2,3,CV_8UC1)
  8. Mat B=Mat::ones(2,3,CV_8UC1)
  9. A.at(0,0)=60
  10. A.at(0,1)=2
  11. A.at(0,2)=3
  12. A.at(1,0)=4
  13. A.at(1,1)=5
  14. A.at(1,2)=6
  15. B.at(0,0)=60
  16. B.at(0,1)=2
  17. B.at(0,2)=3
  18. B.at(1,0)=4
  19. B.at(1,1)=5
  20. B.at(1,2)=6
  21. Mat AB=A.mul(B)
  22. cout<<'A= '< endl<<endl
  23. cout<<'B= '< endl<<endl
  24. cout<<'AB= '< endl<<endl
  25. system('pause')
  26. }


出力:




ABの最初の要素は60 * 60 = 360である必要がありますが、ABのデフォルトタイプはCV_8UC1です。つまり、最大値は255にすぎないためです。mul操作を実行するには、オーバーフローを防ぐために十分な精度でABを定義する必要があります。