先说乘法。按照http://www.opencv.org.cn/forum.php?mod=viewthread&tid=35655的说法,仅当cv::Mat的元素类型是32FC1, 32FC2, 64FC1, 64FC2时,才可以做乘法。否则报错。看下面的例子:
#include <opencv2/opencv.hpp>
#include <iostream>
#pragma comment(lib, "E:\\cv\\opencv\\build\\x86\\vc11\\lib\\opencv_core249d.lib")
#pragma comment(lib, "E:\\cv\\opencv\\build\\x86\\vc11\\lib\\opencv_imgproc249d.lib")
#pragma comment(lib, "E:\\cv\\opencv\\build\\x86\\vc11\\lib\\opencv_highgui249d.lib")
#pragma comment(lib, "E:\\cv\\opencv\\build\\x86\\vc11\\lib\\opencv_ml249d.lib")
#pragma comment(lib, "E:\\cv\\opencv\\build\\x86\\vc11\\lib\\opencv_video249d.lib")
#pragma comment(lib, "E:\\cv\\opencv\\build\\x86\\vc11\\lib\\opencv_features2d249d.lib")
#pragma comment(lib, "E:\\cv\\opencv\\build\\x86\\vc11\\lib\\opencv_calib3d249d.lib")
#pragma comment(lib, "E:\\cv\\opencv\\build\\x86\\vc11\\lib\\opencv_objdetect249d.lib")
#pragma comment(lib, "E:\\cv\\opencv\\build\\x86\\vc11\\lib\\opencv_contrib249d.lib")
#pragma comment(lib, "E:\\cv\\opencv\\build\\x86\\vc11\\lib\\opencv_legacy249d.lib")
#pragma comment(lib, "E:\\cv\\opencv\\build\\x86\\vc11\\lib\\opencv_flann249d.lib")
int main(void)
{
cv::Mat mtx1(2,1,CV_16S);
mtx1.at<short>(0,0) = 1;
mtx1.at<short>(1,0) = 2;
cv::Mat mtx2(2,1,CV_16S);
mtx2.at<short>(0,0) = 3;
mtx2.at<short>(1,0) = 4;
cv::Mat mtx3(2,1,CV_16S);
mtx3.at<short>(0,0) = 5;
mtx3.at<short>(1,0) = 6;
cv::Mat mtx;
cv::hconcat(mtx1, mtx2, mtx);
std::cout<<mtx<<std::endl;;
cv::Mat mtxPrdct = mtx * mtx3;
std::cout<<mtxPrdct;
std::cin.get();
return 0;
}
我定义了三个两行一列的矩阵。然后把前两个矩阵左右合并,构成一个2x2的矩阵,与第三个矩阵相乘,结果报错:
现在修改数据类型:
#include <opencv2/opencv.hpp>
#include <iostream>
#pragma comment(lib, "E:\\cv\\opencv\\build\\x86\\vc11\\lib\\opencv_core249d.lib")
#pragma comment(lib, "E:\\cv\\opencv\\build\\x86\\vc11\\lib\\opencv_imgproc249d.lib")
#pragma comment(lib, "E:\\cv\\opencv\\build\\x86\\vc11\\lib\\opencv_highgui249d.lib")
#pragma comment(lib, "E:\\cv\\opencv\\build\\x86\\vc11\\lib\\opencv_ml249d.lib")
#pragma comment(lib, "E:\\cv\\opencv\\build\\x86\\vc11\\lib\\opencv_video249d.lib")
#pragma comment(lib, "E:\\cv\\opencv\\build\\x86\\vc11\\lib\\opencv_features2d249d.lib")
#pragma comment(lib, "E:\\cv\\opencv\\build\\x86\\vc11\\lib\\opencv_calib3d249d.lib")
#pragma comment(lib, "E:\\cv\\opencv\\build\\x86\\vc11\\lib\\opencv_objdetect249d.lib")
#pragma comment(lib, "E:\\cv\\opencv\\build\\x86\\vc11\\lib\\opencv_contrib249d.lib")
#pragma comment(lib, "E:\\cv\\opencv\\build\\x86\\vc11\\lib\\opencv_legacy249d.lib")
#pragma comment(lib, "E:\\cv\\opencv\\build\\x86\\vc11\\lib\\opencv_flann249d.lib")
int main(void)
{
cv::Mat mtx1(2,1,CV_32FC1);
mtx1.at<float>(0,0) = 1.0;
mtx1.at<float>(1,0) = 2.0;
cv::Mat mtx2(2,1,CV_32FC1);
mtx2.at<float>(0,0) = 3.0;
mtx2.at<float>(1,0) = 4.0;
cv::Mat mtx3(2,1,CV_32FC1);
mtx3.at<float>(0,0) = 5.0;
mtx3.at<float>(1,0) = 6.0;
cv::Mat mtx;
cv::hconcat(mtx1, mtx2, mtx);
std::cout<<mtx<<std::endl;;
cv::Mat mtxPrdct = mtx * mtx3;
std::cout<<mtxPrdct;
std::cin.get();
return 0;
}
运行结果:
矩阵左右拼接是利用cv::hconcat(A, B, C)函数完成的。A,B是输入变量。C是结果。C的左半边是A,右半边是B。此外还有cv::vconcat()函数,用来做上下拼接。