重み付き和.ぶっちゃけ掛けて足すだけ

void cvAddWeighted( CvMat* src1, double alpha, CvMat* src2, double beta, double gamma, CvMat* dst );

src1とsrc2の重み付き和をdstで返す

引数

  • src1:CvMat*型の入力行列/ベクトル
  • src2:CvMat*型の入力行列/ベクトル
  • dst:CvMat*型の出力行列/ベクトル
  • alpha:double型のsrc1の係数
  • beta:double型のsrc2の係数
  • gamma:double型の足し算係数

返り値

  • void型なのでなし

void addWeighted( Mat src1, double alpha, Mat src2, double beta, double gamma, OutputArray dst, int dtype );

C++インタフェース版.C版の関数ラッパーで,実態はC++版.

引数

  • src1:Mat型の入力行列/ベクトル
  • src2:Mat型の入力行列/ベクトル
  • dst:Mat型の出力行列/ベクトル
  • alpha:double型のsrc1の係数
  • beta:double型のsrc2の係数
  • gamma:double型の足し算係数
  • dtype:int型の出力行列/ベクトルの型

解説

  • 実際の所,以下の計算をする関数
    dst(I)=\alpha * src1(I) + \beta * src2(I) + gamma
  • C++版で言えば,Matクラスに掛け算オペレータ*1が付いてるので関数を使わなくても計算できる
  • 関数使った方が最適化されてるっぽい.
  • 引数のCvMat*型やMat型はIplImage*やVecクラスでも代用可能

サンプルコード

  1. #include "opencv2/core/core.hpp"
  2.  
  3. void main(){
  4.   // src1の定義 [ 1 0 0; 0 1 0; 0 0 1] 単位行列
  5.   cv::Mat src1 = cv::Mat::eye(  3, 3, CV_64FC1);
  6.   // src2の定義 [ 1 1 1; 1 1 1; 1 1 1] 要素が全て1の行列
  7.   cv::Mat src2 = cv::Mat::ones( 3, 3, CV_64FC1);
  8.   // dstの定義  [ 0 0 0; 0 0 0; 0 0 0] 要素が全て0の行列
  9.   cv::Mat dst = cv::Mat::zeros(3, 3, CV_64FC1);
  10.  
  11.   // 重み付き和の計算 6:4の重み付きで和をdstに代入する
  12.   cv::addWeighted(src1, 0.6, src2, 0.4, 0, dst);
  13.   // 重み付き和の計算(Cインタフェース版) 重み係数が7:3.結局内部でC++版が呼ばれる
  14.   cvAddWeighted(&(CvMat)src1, 0.3, &(CvMat)src2, 0.7, 0, &(CvMat)dst);
  15.   // 重み付き和の計算 掛け算オペレータで等価な処理が可能
  16.   dst = src1 * 0.3 + src2 * 0.7;
  17.  
  18.   return;
  19. }

実体ファイル

ジャンル:OpenCV:OpenCV 1.1:OpenCV 2.3:OpenCV 2.4準拠


*1 決してBL的な意味ではなく

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2012-06-22 (金) 11:55:52 (1981d)