OpenCV中phase函式計算方向場

2022-01-23 11:27:42 字數 2368 閱讀 9697

一、函式原型

​該函式

引數angleindegrees預設為false,即弧度,當置為true時,則輸出為角度。

phase函式根據函式

來計算角度,計算精度大約為0.3弧度,當x,y相等時,angle為0。

數學上函式atan2為:

該函式的值域為

,可以通過對負數結果加

的方法,將函式的結果對映到

範圍內。

而c++中atan2函式是通過正切值返回弧度的,並通過判斷x,y的正負決定象限,因此c++中atan2函式值域是從-pi到pi的。

二、小實驗

mat mat1(size(4,

1), cv_32fc1), mat2(size(4,

1), cv_32fc1), mat3;

mat1.at

<

float

>(0

, 0) =

1;  mat2.at

<

float

>(0

, 0) =

1;mat1.at

<

float

>(0

, 1) =

1;  mat2.at

<

float

>(0

, 1) =

-1;mat1.at

<

float

>(0

, 2) =

-1; mat2.at

<

float

>(0

, 2) =

1;mat1.at

<

float

>(0

, 3) =

-1; mat2.at

<

float

>(0

, 3) =

-1;phase(mat1,mat2,mat3,

true

);最後mat3的計算結果:

。由此可以看出opencv phase計算出的角度從0°-360°是已x軸正方向為0°,逆時針旋轉增加,符合我們平常角度的計算方式。

三、實際運用

使用函式來計算影象方向場

原始影象

//變數

matimg = cv::imread( "e:/template/***。png",0); 

matgrad1,grad2,angle;

sobel(img, grad1, cv_64fc1, 1, 0); //求梯度

sobel(img, grad2, cv_64fc1, 0, 1);

blur(grad1,grad1,size(6,6));

blur(grad2,grad2,size(6,6));

phase(grad1, grad2, angle, true); //求角度

normalize(angle, angle, 0, 255, norm_minmax); //歸一化 方便顯示,和實際資料沒有關係

angle.convertto(angle,cv_8uc1);

說明

在進行角度計算之前,對sobel計算的兩個結果分別進行了6*6的平均卷積,這是基本的去噪思路。而後到phase一行,角度就已經求出來了,後面是為了方便顯示。

注意,這裡的角度是以x正方向為0,以逆時針為正方向,0-360的度量。並且顯而易見分了內外。這個圓是比較簡單的,如果對於複雜影象,就必須對角度的概念有深入理解。

Opencv中addWeighted 函式用法

void addweighted inputarray src1,double alpha,inputarray src2,double beta,double gamma,outputarray dst,int dytpe 1 第乙個引數,inputarray型別的src1,表示需要加權的第乙個陣...

OpenCV學習 OpenCV中的工具函式

opencv庫中還提供了一些專用功能,可以更好的處理計算機視覺中普遍出現的數學和其他問題。在庫的環境中它們被稱為工具函式。工具函式包含數學操作 測試 錯誤生成 記憶體與執行緒處理 優化及其他的工具。函式名稱 描述cv alignptr 對齊指標到給定位元組數 cv alignsize 將緩衝區大小給...

Opencv中cvSobel函式使用

sobel運算元為邊沿檢測中常用的運算元之一。以下給出opencv手冊中的說明 使用擴充套件 sobel 運算元計算一階 二階 三階或混合影象差分 void cvsobel const cvarr src,cvarr dst,int xorder,int yorder,int aperture si...