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