[英]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);
請查看此以獲取更多信息。
希望這可以幫助!
你想創建一個kernel
與negative
的元素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]
一個類似的問題:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.