如何乘以垫子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>
是错误的,因为AB
是src
的副本,很可能是一个CV_8UC1 matrix
,所以它必须是AB.at<uchar>
的,或者你必须首先AB
转换为float
(CV_32FC1
(
相关文章:
- 函数何时会在c++中包含stack_Unwind_Resume调用
- Python中的for循环与C++有何不同
- 在C++中释放内存期间,迭代器与指针有何不同
- 在 C++ 中的数组上使用阶乘函数
- 阶乘问题在 c++ 中给出错误的输出
- 加、乘、除、减复数的问题 C++ - 运算符重载
- 大数的阶乘给出错误的输出
- 标准对此指向成员函数类型模板参数有何说明?是我的代码有误,还是 MSVS 16.6 有问题?
- 什么模板用法在阶乘中更好
- 为什么我在C++阶乘函数中出现编译错误?
- 计算阶乘的 C++17 倍表达式中的错误
- 为什么 Lisp 中 1000 阶乘的计算如此之快(并显示正确的结果)?
- 在C++中执行 N 阶乘编译时间的 3 种不同/相同方法
- 类中的 C++ int 被设置为值,似乎不知从何而来
- 平方模型为零,阶乘模型问题
- 阶乘元规划
- -fvisibility-inline-hidden 与 gcc 中的 -fvisibility=hidden 有何不同
- 如何制作每秒从 30 乘 1 倒计时的计时器?
- 阶乘-c++ 我想以不同的方式打印
- C++14 将元组扩展三乘三