【发布时间】:2013-01-05 18:48:39
【问题描述】:
嗨,我正在尝试使用 Mat 课。 我想在两个图像之间明智地做一个产品元素,MATLAB的c++/opencv端口immultiply。
这是我的代码:
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>
using namespace cv;
using namespace std;
Mat imgA, imgB;
Mat imgAB;
Mat product;
void printMinMax(Mat m, string s) {
double minVal;
double maxVal;
Point minLoc;
Point maxLoc;
minMaxLoc( m, &minVal, &maxVal, &minLoc, &maxLoc );
cout << "min val in " << s << ": " << minVal << endl;
cout << "max val in " << s << ": " << maxVal << endl;
}
int main(int /*argc*/, char** /*argv*/) {
cout << "OpenCV version: " << CV_MAJOR_VERSION << " " << CV_MINOR_VERSION << endl;
imgA = imread("test1.jpg");
cout << "original image size: " << imgA.rows << " " << imgA.cols << endl;
cout << "original type: " << imgA.type() << endl;
cvtColor(imgA, imgA, CV_BGR2GRAY);
printMinMax(imgA, "imgA");
imgB = imread("test2.jpg");
cout << "original image size: " << imgB.rows << " " << imgB.cols << endl;
cout << "original type: " << imgB.type() << endl;
cvtColor(imgB, imgB, CV_BGR2GRAY);
printMinMax(imgB, "imgB");
namedWindow("originals", CV_WINDOW_AUTOSIZE);
namedWindow("product", CV_WINDOW_AUTOSIZE);
imgAB = Mat( max(imgA.rows,imgB.rows), imgA.cols+imgB.cols, imgA.type());
imgA.copyTo(imgAB(Rect(0, 0, imgA.cols, imgA.rows)));
imgB.copyTo(imgAB(Rect(imgA.cols, 0, imgB.cols, imgB.rows)));
product = imgA.mul(imgB);
printMinMax(product, "product");
while( true )
{
char c = (char)waitKey(10);
if( c == 27 )
{ break; }
imshow( "originals", imgAB );
imshow( "product", product );
}
return 0;
}
结果如下:
OpenCV version: 2 4
original image size: 500 500
original type: 16
min val in imgA: 99
max val in imgA: 255
original image size: 500 500
original type: 16
min val in imgB: 0
max val in imgB: 255
init done
opengl support available
min val in product: 0
max val in product: 255
我认为产品中的最大值必须大于 255,但被截断为 255,因为两个矩阵的类型是 16。 我试图将矩阵转换为 CV_32F,但产品中的 maxVal 是 64009(我不明白的数字)
【问题讨论】:
-
先尝试一个小的 3x1 和 1x3 矩阵,看看你的乘法是否正确。
-
是的,很好的建议。无论如何我想进行元素乘法,而不是矩阵乘积,所以我认为 2 mat 需要具有相同的大小
-
只要确保您使用的是正确的产品。你不能做 1x255 的事情并期望得到不同于 255 的结果。
-
哦,还有一件事伴侣:) 尝试初始化“产品”矩阵,我不知道您的图像是否是彩色的,但可能类型是 CV_8UCx,它会截断您的结果。检查类型然后初始化
-
非常感谢朋友!现在“事情是如何工作的”更清楚了,看看我自己的答案!
标签: c++ matlab opencv multiplication