opencv mat的拼接,及乘法

来源:互联网 发布:汽车epc软件下载 编辑:程序博客网 时间:2024/05/22 01:33

先说乘法。按照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()函数,用来做上下拼接。

原创粉丝点击