試した環境
- OpenCV 4.5.3
- Microsoft Visual Studio Community 2019 Version 16.10.3
本題
cv::transform
のドキュメントには変換行列m
は2行2列または2行3列の行列であることが書かれています。
https://docs.opencv.org/4.5.3/d2/de8/group__core__array.html#ga393164aa54bb9169ce0a8cc44e08ff22
m transformation 2x2 or 2x3 floating-point matrix.
しかし試したところ、ほかの行列でも動きました。 今回試したのは1行3列の変換行列ですが、ほかの場合でも動くかは未確認です。 実験に使ったコードは以下の通りです。
#include <opencv2/opencv.hpp> int main(int argc, char* argv[]) { cv::Mat3b src(4, 4, cv::Vec3b(0, 64, 128)); cv::Mat dst; cv::Mat1f m(1, 3, 1.f); cv::transform(src, dst, m); std::cout << "src.channels = " << src.channels() << std::endl; std::cout << src << std::endl; std::cout << "dst.channels = " << dst.channels() << std::endl; std::cout << dst << std::endl; return 0; }
結果は以下の通りです。
チャネル数3のsrc
がチャネル数1に変換されています。
src.channels = 3 [ 0, 64, 128, 0, 64, 128, 0, 64, 128, 0, 64, 128; 0, 64, 128, 0, 64, 128, 0, 64, 128, 0, 64, 128; 0, 64, 128, 0, 64, 128, 0, 64, 128, 0, 64, 128; 0, 64, 128, 0, 64, 128, 0, 64, 128, 0, 64, 128] dst.channels = 1 [192, 192, 192, 192; 192, 192, 192, 192; 192, 192, 192, 192; 192, 192, 192, 192]