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ステートメント:
- //! per-element matrix multiplication by means of matrix expressions
- 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検証:
- #include 'core/core.hpp'
- #include 'iostream'
- using namespace std
- using namespace cv
- int main(int argc,char *argv[])
- {
- Mat A=Mat::ones(2,3,CV_8UC1)
- Mat B=Mat::ones(2,3,CV_8UC1)
- A.at(0,0)=60
- A.at(0,1)=2
- A.at(0,2)=3
- A.at(1,0)=4
- A.at(1,1)=5
- A.at(1,2)=6
- B.at(0,0)=60
- B.at(0,1)=2
- B.at(0,2)=3
- B.at(1,0)=4
- B.at(1,1)=5
- B.at(1,2)=6
- Mat AB=A.mul(B)
- cout<<'A=
'< endl<<endl
- cout<<'B=
'< endl<<endl
- cout<<'AB=
'<
endl<<endl - system('pause')
- }
出力:
ABの最初の要素は60 * 60 = 360である必要がありますが、ABのデフォルトタイプはCV_8UC1です。つまり、最大値は255にすぎないためです。mul操作を実行するには、オーバーフローを防ぐために十分な精度でABを定義する必要があります。