2017-08-07 33 views
-6

我想在不使用multiply()函數的情況下乘兩個Mat類型A和B(灰色縮放)。到目前爲止,我開發了下面的代碼,它不起作用。我檢查了它的工作的乘法(A,B,AB)函數,但下面的代碼不起作用。如何乘以墊子A * B?

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); 

問題視覺工作室給中止()被調用

OpenCV Error: Assertion failed (((((sizeof(size_t)<<28)|0x8442211) >> ((DataType<_Tp>::depth) & ((1 << 3) - 1))*4) & 15) == elemSize1()) in cv::Mat::at, file d:\opencv\opencv\build\include\opencv2\core\mat.inl.hpp, line 957 
+2

「下面的代碼沒有工作「 你可以說得更詳細點嗎? – DimChtz

+3

你知道如何乘以矩陣嗎? – jxh

+4

您編寫的代碼執行每個成員的乘法,而不是矩陣乘法。這是完全錯誤的算法。 – Frank

回答

1

這是提高概念

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(); 

但請記住,此代碼將工作緩慢。您需要使用指針來加速進程

+0

仍然相同的問題視覺工作室給** **中止()已被稱爲** – komto909

+0

我作出的更改仍然不起作用相同的問題 – komto909

+0

我試過你的最終代碼它的工作,我得到的輸出,但我仍然得到這個問題** abort()被稱爲** – komto909

0

最大問題來自int AB_yx;變量的管理。它未初始化,並且在每次迭代開始時也應該重置爲0。

另一個問題是,AB也用於未初始化,您應該調整它到適當的維度,然後開始在它內部的任意索引分配數據。

+0

我做了更改,沒有編譯相同的問題 – komto909

0

AB.at<float>是錯誤的,因爲ABsrc副本里面很可能是一個CV_8UC1 matrix,所以它必須是AB.at<uchar>或者你必須轉換ABfloatCV_32FC1

相關問題