簡體   English   中英

創建自己的線性過濾器

[英]Creating Your Own Linear Filter

我是Opencv C ++的新手。 我試圖用圖像卷積一個掩碼。 為此,我想創建自己的蒙版,以便我可以使用filter2D數組函數將我的蒙版與圖像進行卷積。 我想創建的面具是:

char mask [3][3]=  {{-1,0,1},{-1,0,1},{-1,0,1}};

為此我嘗試了下面的代碼(生成這個掩碼): -

Mat kernel(3,3, CV_8UC1, Scalar(-1,0,1)); 

我已將面具值打印為

std::cout << kernel;

但我得到的答案是0,0,0; 0,0,0; 0,0,0

我期待答案是-1,0,1; -1,0,1; -1,0,1

我知道我在正確編寫頻道時犯了一個錯誤。 任何人都可以幫助我理解通道(CV_8UC1 ....)的含義以及如何糾正它並獲得正確的輸出。

CV_8UC1表示1通道,8位,uchar圖像。

標量用於設置每個通道的值,而不是每個像素/坐標。

例1:

Mat kernel(3,3, CV_8UC1, Scalar::all(0)) 

將意味着創建一個0s的3X3矩陣,因為它是CV_8UC1類型,你只能提到一個值,在這種情況下為0。

EX 2:

Mat kernel(3,3, CV_8UC3, Scalar(0,0,255)) 

表示創建一個3個通道的3X3矩陣,因為類型為CV_8UC3 ,設置通道1為0,通道2為0,通道3為255。

因此,為了您的目的設置行值,您不能使用標量。 而是這樣做:

Mat C = (Mat_<double>(3,3) << -1, 0, 1, -1, 0, 1, -1, 0, 1);

請查看以獲取更多信息。

希望這可以幫助!

你想創建一個kernelnegative的元素filter2D ,那么你should't使用的數據類型CV_8UC1 There is no negative value in unsigned type

Mat kernel(3,3, CV_8UC1, Scalar(-1,0,1)); 意味着創建一個signal-channel-unsigned-char內核。 您將Scalar(-1,0,1)設置為kernel ,然后僅the first element(that is double -1) ,而saturate_cast<unchar>(-1) = 0

通常,請改用CV_32FC1


例如:

#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;

int main(){
    float mask[9] = {-1,0,1, -1, 0, 1, -1,0,1};
    Mat kernel(3,3, CV_32FC1);
    memcpy(kernel.data, mask, sizeof(float)*9);
    cout << kernel<<endl;
}

結果:

[-1, 0, 1;
 -1, 0, 1;
 -1, 0, 1]

一個類似的問題:

如何使用模板函數從緩沖區(T *數據數組)創建cv :: Mat?

暫無
暫無

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

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