如何乘以垫子A * B?

How to multiply Mat A * B?

本文关键字:何乘      更新时间:2023-10-16

我正在尝试在不使用 multiply(( 函数的情况下将两个 Mat 类型 A 和 B(灰度缩放(相乘。 到目前为止,我开发了下面的代码,但它不起作用。我用乘法(A,B,AB(函数检查了它的工作,但下面的代码不起作用。

Mat A,B,AB, src;
float AB_yx;
src = imread("as.jpg", CV_LOAD_IMAGE_GRAYSCALE);
Sobel(src , A, CV_32FC1 , 1, 0, 3, BORDER_DEFAULT);
Sobel(src , B, CV_32FC1 , 0, 1, 3, BORDER_DEFAULT);
// multiply(A, B, AB); //worked
AB= src.clone();
for (int y = 0; y < A.rows; y++) {
for (int x = 0; x < B.cols; x++) {
AB_yx= 0;
for (int y = 0; y < B.rows; y++) {
// for (int k = 0; k < B.rows; k++) {
AB.at<float>(y, x) = A.at<float>(y, x) * B.at<float>(y, x); //sturkmen's method
//AB_yx = AB_yx + A.at<float>(y, k) * B.at<float>(k, x);//
}
//AB.at<float>(y, x) = AB_yx; 
}
}


namedWindow("AB");
imshow("AB", AB);

问题 Visual Studio 给出 abort(( 已调用

OpenCV Error: Assertion failed (((((sizeof(size_t)<<28)|0x8442211) >> ((DataType<_Tp>::depth) & ((1 << 3) - 1))*4) & 15) == elemSize1()) in cv::Mat::at, file d:opencvopencvbuildincludeopencv2coremat.inl.hpp, line 957

这是为了改进概念

Mat A = (Mat_<float>(3, 4) << 1, 2, 3, 4, 5, 6, 7, 8, 9, 0.1, 0.1, 0.3);
Mat B = (Mat_<float>(3, 4) << 1, 2, 3, 4, 5, 6, 7, 8, 9, 0.1, 0.1, 0.3);
Mat AB0;
multiply(A, B, AB0);
cout << A << endl;
cout << B << endl;
cout << AB0 << endl;
Mat AB1 = Mat(A.size(), CV_32FC1);
for (int x = 0; x < B.cols; x++)
{
for (int y = 0; y < B.rows; y++)
{
AB1.at<float>(y, x) = A.at<float>(y, x) * B.at<float>(y, x);
}
}
cout << AB1 << endl;

这应该对你有用

Mat A, B, AB, src;
src = imread("as.jpg", CV_LOAD_IMAGE_GRAYSCALE);
Sobel(src, A, CV_32FC1, 1, 0, 3, BORDER_DEFAULT);
Sobel(src, B, CV_32FC1, 0, 1, 3, BORDER_DEFAULT);
AB = Mat(A.size(), CV_32FC1);
for (int x = 0; x < B.cols; x++)
{
for (int y = 0; y < B.rows; y++)
{
AB.at<float>(y, x) = A.at<float>(y, x) * B.at<float>(y, x);
}
}

namedWindow("AB");
imshow("AB", AB);
waitKey();

但请记住,此代码将运行缓慢。 您需要使用指针来加快该过程

最大的问题来自int AB_yx;变量的管理。它是未初始化的,也应在每次x迭代开始时重置为 0。

另一个问题是,AB也是未初始化使用的,在开始在其中的任意索引处分配数据之前,应将其大小调整为适当的维度。

AB.at<float>是错误的,因为ABsrc的副本,很可能是一个CV_8UC1 matrix,所以它必须是AB.at<uchar>的,或者你必须首先AB转换为float(CV_32FC1(