簡體   English   中英

在opencv中划分兩個矩陣

[英]divide two matrices in opencv

我想對兩個 opencv CV_32S 矩陣(A 和 B)執行元素划分。

當 B 不為 0 時,我想要 C = A/B,否則為 0。

但我不確定是否了解 opencv 文檔:

http://docs.opencv.org/modules/core/doc/operations_on_arrays.html#divide

它說:

當 src2(I) 為零時,dst(I) 也將為零。 多通道陣列的不同通道獨立處理。

注意 當輸出數組的深度為 CV_32S 時,不應用飽和度。 在溢出的情況下,您甚至可能得到錯誤符號的結果。

saturate() 函數有什么作用? 我可以對 CV_32S 矩陣安全地使用 Division(A,B,C) 嗎? divide() 與 / 運算符有何不同?

===== 測試后編輯 =====

我的測試表明 / 運算符完全符合我的要求:C = A/B 當 B != 0 時,否則為 0。

saturate_cast 可防止某些數據類型溢出,例如, 255 for CV_8U ,像素值200+200將減少到255 for CV_8U (否則會發生溢出,並且可能會出現意外值)。

如果您想了解更多關於 saturate_cast 的信息,請查看鏈接。 http://docs.opencv.org/modules/core/doc/intro.html#saturation-arithmetics

由於整數除法總是減少絕對值,整數除法中不應該發生溢出(或者我錯過了什么?),所以我猜你應該是安全的。

所以, operator/cv::divide實際上應該是一樣的,只不過操作符會返回一個矩陣表達式,它的求值被延遲了。 最后, operator/也將調用cv::divide ,如這里的一個簡單案例所示。 尤其是結果應該是平等的。

不過,結果可能會令人驚訝。 使用兩個整數矩陣進行除法,結果將類似於在浮點算術中完成的,然后是舍入到最接近的整數,更喜歡偶數(另請參見nearbyint() )。 例如,使用兩個 6x6 整數矩陣,您將得到

0/0 == 0    1/0 == 0    2/0 == 0    3/0 == 0    4/0 == 0    5/0 == 0
0/1 == 0    1/1 == 1    2/1 == 2    3/1 == 3    4/1 == 4    5/1 == 5
0/2 == 0    1/2 == 0    2/2 == 1    3/2 == 2    4/2 == 2    5/2 == 2
0/3 == 0    1/3 == 0    2/3 == 1    3/3 == 1    4/3 == 1    5/3 == 2
0/4 == 0    1/4 == 0    2/4 == 0    3/4 == 1    4/4 == 1    5/4 == 1
0/5 == 0    1/5 == 0    2/5 == 0    3/5 == 1    4/5 == 1    5/5 == 1

請注意div-by-0-equals-0 (正如您在文檔中所述),但還要注意四舍五入 (四舍五入)和搶七局-1-2 同時搶七局-3-2 (平局平局)。


注意:兩個浮點類型矩陣沒有定義任何特殊行為,而是在被零除的情況下計算為 -inf、nan 或 inf。 當您將兩個浮點矩陣相除但請求整數結果時,這甚至成立。 在這種情況下,-inf、nan 和 inf 將轉換為最小值,這可能是一個錯誤(或者只是未由 OpenCV 定義)。


整數除法div.cpp代碼(使用g++ -std=c++11 div.cpp -o div -lopencv_core ):

#include <opencv2/opencv.hpp>
#include <iostream>
#include <cstdint>

int main() {
    cv::Mat i1(6,6,CV_32S);
    cv::Mat i2(6,6,CV_32S);
    for (int y = 0; y < i1.rows; ++y) {
        for (int x = 0; x < i1.cols; ++x) {
            i1.at<int32_t>(y, x) = x;
            i2.at<int32_t>(y, x) = y;
        }
    }

    cv::Mat q;
    cv::divide(i1, i2, q);
//  q = i1 / i2;

    for (int y = 0; y < q.rows; ++y) {
        for (int x = 0; x < q.cols; ++x)
            std::cout << x << "/" << y << " == " << q.at<int32_t>(y, x) << "\t";
        std::cout << std::endl;
    }

    return 0;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM