OpenCV-滤波矩阵(java版)

滤波矩阵


用下图做演示
在这里插入图片描述

multiply()

顾名思义,乘法函数。使用该函数可以将像素的每个通道值乘以这个参数。

方法说明
multiply(Mat src1, Scalar src2, Mat dst, double scale, int dtype) src1:原图像
src2:颜色矩阵
scale:src2矩阵参数的乘数值(从图像的角度来说,可以理解为亮度值,值越大,图像越亮)
dst:目标图像
dtype:图像(矩阵)类型
multiply(Mat src1, Scalar src2, Mat dst, double scale)
multiply(Mat src1, Scalar src2, Mat dst)
例:当 src2为[0.0,0.5,1.0]时候,表示在原矩阵像素值的基础上,蓝色通道值乘以0,绿色通道值乘以0.5,红色通道值乘以0(当最终通道值大于255时,通道值为255)
scale:表示在src通道的基础上乘以相对应的scale值,比如scale为3时,结合前面的src2矩阵,此时src2矩阵值变为[0.0,1.5,3.0]
为验证结果,下面创建一个3*3,像素值为[122,122,122]的矩阵图 示例:
    public static void main(String[] args) {
        String libraryPath= System.getProperty("user.dir")+"\\lib\\opencv_java460.dll";
        System.load(libraryPath);
        Mat mat = new Mat(3,3, CvType.CV_8UC3,new Scalar(122,122,122));
        System.out.println("mat1>>"+mat.dump());
        Core.multiply(mat,new Scalar(0.0,0.5,1.0),mat,3,CvType.CV_8UC3);
        System.out.println("mat2>>"+mat.dump()+"=="+mat);
        HighGui.imshow("mat",mat);
        HighGui.waitKey(0);
    }

执行结果

mat1>>[122, 122, 122, 122, 122, 122, 122, 122, 122;
122, 122, 122, 122, 122, 122, 122, 122, 122;
122, 122, 122, 122, 122, 122, 122, 122, 122]
mat2>>[ 0, 183, 255, 0, 183, 255, 0, 183, 255;
0, 183, 255, 0, 183, 255, 0, 183, 255;
0, 183, 255, 0, 183, 255, 0, 183, 255]==Mat [ 33CV_8UC3, isCont=true, isSubmat=false, nativeObj=0xbdaeb0, dataAddr=0xbdb100 ]

读取图像
示例:

    public static void main(String[] args) {
        String libraryPath= System.getProperty("user.dir")+"\\lib\\opencv_java460.dll";
        System.load(libraryPath);
        Mat mat = Imgcodecs.imread("flower.jpg");
        Core.multiply(mat,new Scalar(0.0,0.5,1.0),mat,1.0,CvType.CV_8UC3);
        HighGui.imshow("mat",mat);
        HighGui.waitKey(0);
    }

结果
在这里插入图片描述
亮度演示:
示例:

    public static void main(String[] args) {
        String libraryPath= System.getProperty("user.dir")+"\\lib\\opencv_java460.dll";
        System.load(libraryPath);
        Mat mat = Imgcodecs.imread("flower.jpg");
        //为演示效果,将Scalar设为(1.0,1.0,1.0)
        Core.multiply(mat,new Scalar(1.0,1.0,1.0),mat,2.0,CvType.CV_8UC3);
        HighGui.imshow("mat",mat);
        HighGui.waitKey(0);
    }

结果:在这里插入图片描述

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是使用Python和OpenCV实现卡尔曼滤波的示例代码: ```python import numpy as np import cv2 # 初始化卡尔曼滤波器 kalman = cv2.KalmanFilter(4, 2) kalman.measurementMatrix = np.array([[1, 0, 0, 0], [0, 1, 0, 0]], np.float32) kalman.transitionMatrix = np.array([[1, 0, 1, 0], [0, 1, 0, 1], [0, 0, 1, 0], [0, 0, 0, 1]], np.float32) kalman.processNoiseCov = np.array([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]], np.float32) * 0.03 kalman.measurementNoiseCov = np.array([[1, 0], [0, 1]], np.float32) * 0.1 # 初始化视频捕捉 cap = cv2.VideoCapture(0) while True: # 读取一帧 ret, frame = cap.read() # 对帧进行预处理 gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) gray = cv2.GaussianBlur(gray, (5, 5), 0) # 检测边缘 edges = cv2.Canny(gray, 50, 150, apertureSize=3) # 检测直线 lines = cv2.HoughLinesP(edges, 1, np.pi/180, 100, minLineLength=100, maxLineGap=10) # 如果检测到直线 if lines is not None: for line in lines: x1, y1, x2, y2 = line[0] # 使用卡尔曼滤波器估计下一帧的线段 prediction = kalman.predict() measurement = np.array([[np.float32(x1)], [np.float32(y1)]]) kalman.correct(measurement) # 绘制估计线段 x1p, y1p, x2p, y2p = np.int32(prediction) cv2.line(frame, (x1p, y1p), (x2p, y2p), (0, 255, 0), 2) # 显示结果 cv2.imshow('frame', frame) # 按下Esc键退出 if cv2.waitKey(1) == 27: break # 清理 cap.release() cv2.destroyAllWindows() ``` 这段代码使用OpenCV捕获实时视频流,并使用卡尔曼滤波器对检测到的直线进行估计。卡尔曼滤波器的参数在初始化时设置。首先,我们设置卡尔曼滤波器的状态向量和观测向量的维数(在本例中为4和2)。然后,我们设置测量矩阵、转移矩阵和过程噪声协方差矩阵。最后,我们设置测量噪声协方差矩阵。在每一帧中,我们使用卡尔曼滤波器来估计下一帧的线段,并绘制估计线段。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不要喷香水

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值