Skip to content

Instantly share code, notes, and snippets.

@robosina
Created October 22, 2020 09:23
Show Gist options
  • Save robosina/649ff569a4add6ba946a2a540f859fdb to your computer and use it in GitHub Desktop.
Save robosina/649ff569a4add6ba946a2a540f859fdb to your computer and use it in GitHub Desktop.
MotionBlur in opencv c++
#include <opencv2/opencv.hpp>
using namespace cv;
#include <assert.h>
//#define normal
void CreateKernel(cv::Mat& kernel,
int KernelSize,
float angle /*angle is in degree format*/);
void motionBlur(cv::InputArray src,cv::Mat & dst,int angle,int kernel_size);
int main()
{
cv::Mat img = cv::imread("/home/isv/Documents/segment/original/1.jpg");
cv::Mat dst;
int angle=30;
int kernelSize=20;
motionBlur(img,dst,angle,kernelSize);
}
void CreateKernel(cv::Mat& kernel,
int KernelSize,
float angle /*angle is in degree format*/){
kernel=cv::Mat(KernelSize,KernelSize,CV_32FC3,0.0);
assert(angle>=0 && angle<=180);
auto dcot = [](float & angle_degree){
double rad = std::tan(angle_degree*CV_PI/180.0);
return (1.0/rad);
};
cv::Point p1,p2;
if(angle==0 | angle==180){
p1=cv::Point(KernelSize,KernelSize/2);
p2=cv::Point(0,KernelSize/2);
}else if(angle==90){
p1=cv::Point(KernelSize/2,0);
p2=cv::Point(KernelSize/2,KernelSize);
}else{
float x1 = dcot(angle)*(KernelSize/2)+KernelSize/2;
float x2 = -dcot(angle)*(KernelSize/2)+KernelSize/2;
p1=cv::Point(x1,0);
p2=cv::Point(x2,KernelSize);
}
cv::line(kernel,p1,p2,cv::Scalar(1,1,1),1,cv::LINE_8);
cv::multiply(kernel,(float) 1.0/KernelSize,kernel);
}
void motionBlur(cv::InputArray src,cv::Mat & dst,int angle,int kernel_size){
cv::Mat kernel;
CreateKernel(kernel,kernel_size,angle);
cv::filter2D(src,dst,CV_32FC3,kernel);
dst.convertTo(dst,CV_8UC3);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment