OpenCV 運動模糊的模擬 C

2021-09-13 17:50:52 字數 1793 閱讀 4153

運動模糊時,模糊後某點的值應該與原圖沿運動角度方向前面的點有關,並且越近鄰影響越大,即權值越大。所以除了確定卷積核之外,還確定了錨點(anchor)

右下角60度移動,距離50

**實現:

#include "opencv2/opencv.hpp"

typedef cv::mat mat;

void genaratepsf(mat &psf, cv::point &anchor, double len,double angle);

int main(int argc, char * ar**)

mat srcimage = cv::imread(ar**[1], cv::imread_color);

if( srcimage.empty() )

return -1;

imshow( "src_img", srcimage );

double len = 50;

double angle = -60;

mat ker, dst;

cv::point anchor;

genaratepsf(ker, anchor, len, angle);

/// 使用濾波器

filter2d(srcimage, dst, -1 , ker, anchor );

//    cv::normalize(dst_plane[0], dst_plane[0], 1, 0, cv_minmax);

imshow( "dest", dst );

cv::waitkey(0);

return 1;

}void genaratepsf(mat &psf, cv::point &anchor, double len,double angle)

else else

}int psfwdt = 1;

//模糊核大小

int sx = (int)fabs(half*cosalpha + psfwdt*xsign - len*flt_epsilon );

int sy = (int)fabs(half*sinalpha + psfwdt - len*flt_epsilon);

cv::mat_psf1(sy, sx, cv_64f);

//psf1是左上角的權值較大,越往右下角權值越小的核。

//這時運動像是從右下角到左上角移動

for (int i = 0; i < sy; i++)

pvalue[j] = psfwdt + flt_epsilon - fabs(pvalue[j]);

if (pvalue[j] < 0)}}

//    運動方向是往左上運動,錨點在(0,0)

anchor.x = 0;

anchor.y = 0;

//    運動方向是往右上角移動,錨點乙個在右上角

//    同時,左右翻轉核函式,使得越靠近錨點,權值越大

if (angle<90 && angle>0)else if( angle>-90 && angle<0)else if( angle

/*保持影象總能量不變,歸一化矩陣*/

double sum = 0;

for (int i = 0; i < sy; i++)

}psf = psf1 / sum;

}參考:

運動模糊的實現

運動模糊常用於烘托遊戲氣氛 製作場景動畫,以及遊戲的畫面特效中,賽車類遊戲很常見此類特效,還有一些忍者遊戲中的忍者快速移動後的拖尾效果也是如此原理。運動模糊效果圖 運動模糊的原理很簡單,即多遍繪製畫面。依次繪製第n和第n 1 n 2 幀畫面,而且每次繪製將透明度降低形成消逝的感覺。具體需要模糊多少幀...

OpenCV實現運動目標檢測的函式

引數 dst 檢測結果 void update mhi iplimage img,iplimage dst,int diff threshold for i 0 i n i cvreleaseimage mhi mhi cvcreateimage size,ipl depth 32f,1 cvzer...

三體運動的程式模擬

前幾天看了 三體 很不錯的科幻 說到三體,我想到我大學的乙個舍友叫王晶,和香港那個導演同名同姓同性別.記得有一次幾個同學在一塊聊天,有個女生問他 父母為什麼給他取名叫晶.他說叫晶是父母希望能有三個太陽守護著他。那時我還很單純,不會用五行缺什麼的話來諷刺他,只是說,如果給他起名叫王晶晶的話,那就有6個...