如何系列 如何使用OpenCV进行图像操作

news2024/11/25 23:42:56

文章目录

    • 简介
    • 集成
    • 代码示例
      • 加载和显示图像
      • 编辑和保存图像
      • 边缘检测
      • 图片属性
      • 图像旋转
      • 图像缩放
      • 图像拼接
      • 颜色空间转换
      • 图像模糊平滑化
      • 腐蚀和膨胀
      • 直方图均衡化
      • 图像分割
      • 模板匹配
      • 图像特征提取
      • 图像拟合
      • 图像标注
      • 轮廓检测
      • 背景减除
      • 图像混合
      • 颜色分割
      • 图像旋转裁剪
      • 在图像上写文字
      • 检测和裁剪人脸
      • 灰度化图像
      • 二值化
      • 背景去除
      • 特征点检测
    • 参考

简介

OpenCV (Open Source Computer Vision Library) 是一个计算机视觉和机器学习的开源库,其提供了丰富的图像处理和计算机视觉算法。OpenCV 最初是为 C++ 编写的,但现在也支持 Java 编程语言。

你就认为是个增强版的ps工具

以下是一些 OpenCV 的功能和能够实现的任务:

  1. 图像读取和显示:OpenCV 可以读取多种图像格式,并提供图像显示的功能。
  2. 图像处理:OpenCV 提供了各种图像处理工具,包括滤波、增强、色彩转换、几何变换等。
  3. 特征检测与描述:OpenCV 可以检测图像中的关键点,并计算用于描述这些关键点的特征向量,例如 SIFT、SURF、ORB 等。
  4. 图像匹配与识别:OpenCV 允许你使用特征匹配算法来识别或跟踪物体,也可以进行模板匹配。
  5. 物体检测:OpenCV 提供了各种物体检测器,如人脸检测、车辆检测、目标检测等。
  6. 形态学操作:用于处理二值图像,包括膨胀、腐蚀、开运算、闭运算等。
  7. 图像分割:OpenCV 支持图像分割技术,如阈值分割、边缘检测、区域生长等。
  8. 图像重映射:可以通过重映射函数将图像的像素位置重新映射到新的位置。
  9. 颜色空间转换:允许在不同颜色空间之间进行转换,如 RGB 到 HSV、灰度等。
  10. 图像拼接:用于将多幅图像拼接成全景图像,支持水平和垂直拼接。
  11. 摄像头捕捉和视频处理:OpenCV 可以从摄像头捕捉实时视频,并进行视频处理、分析和流处理。
  12. 计算机视觉算法:OpenCV 包含各种计算机视觉算法,如光流、相机标定、三维重建、立体视觉等。
  13. 机器学习集成:OpenCV 可以与机器学习库集成,如 TensorFlow 和 PyTorch,以构建深度学习模型并进行推理。
  14. 图像绘制和标注:用于在图像上绘制文本、线条、形状等,以标注图像。
  15. 背景减除:用于从图像中分离前景对象和背景。
  16. 图像相似度度量:可以计算两幅图像之间的相似度,如结构相似性指数(SSIM)等。
  17. 多视图几何:支持多视图几何算法,如立体校正、三角测量等。
  18. 人脸识别与追踪:OpenCV 提供了人脸检测、识别和追踪的功能。
  19. 深度学习集成:OpenCV 提供了深度学习模型的加载、推理和微调功能,支持多种深度学习框架。
  20. 图像处理管道和流程:可以构建复杂的图像处理管道,以进行自动化图像处理和分析。

这些只是 OpenCV 提供的一些功能和应用示例。OpenCV 在计算机视觉和图像处理领域具有广泛的应用,可用于图像编辑、机器视觉、自动驾驶、医学图像分析、安全监控、虚拟现实等多个领域。你可以根据具体项目需求,结合 OpenCV 的功能来完成各种图像处理和计算机视觉任务。

集成

1.添加Maven依赖项

<dependency>
    <groupId>org.openpnp</groupId>
    <artifactId>opencv</artifactId>
    <version>4.7.0-0</version>
</dependency>

2.添加动态库

// 会从jar内复制对应的动态库到临时目录
// 并调用System.loadLibrary(org.opencv.core.Core.NATIVE_LIBRARY_NAME);
nu.pattern.OpenCV.loadShared();

代码示例

  • Mat 类表示 n 维密集数值单通道或多通道数组。 它可用于存储实值或复值向量和矩阵、灰度或彩色图像、体素体积、向量场、点云、张量、直方图。

加载和显示图像

要在 Java 中加载和显示图像,可以使用 imread 和 imshow 函数。以下是一个简单的示例代码:

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.highgui.HighGui;
public class ImageProcessing {
    public static void main(String[] args) {
        nu.pattern.OpenCV.loadShared();
        // 加载图像
        Mat image = org.opencv.imgcodecs.Imgcodecs.imread("path/to/image.jpg");
        // 显示图像
        HighGui.imshow("Image", image);
        // 等待用户按下任意键关闭窗口
        HighGui.waitKey();
    }
}

编辑和保存图像

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
public class Main {
  public static void main(String[] args) {
    // 加载 OpenCV 库
    nu.pattern.OpenCV.loadShared();
    // 读取图像
    Mat image = Imgcodecs.imread("images/_abc.png");
    // 画直线 图片,线段的第一个点,线段的第二个点,线段的颜色,线的宽度
    Imgproc.line(image, new Point(0, 0), new Point(image.cols(), image.rows()), new Scalar(0, 0, 255), 2);
    // 保存图像
    Imgcodecs.imwrite("images/_abc2.png", image);
  }
}

边缘检测

边缘检测是一种常用的图像分析技术,可以用于检测图像中的边缘和轮廓。以下是一个示例代码:

import org.opencv.core.Mat;
import org.opencv.core.Size;
import org.opencv.highgui.HighGui;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
public class Test {
    public static void main(String[] args) {
        // 加载 OpenCV 库
        nu.pattern.OpenCV.loadShared();
        // 加载图像
        Mat image = Imgcodecs.imread("images/_abc.png");
        // 从彩色转换为灰度图像。这是因为边缘检测通常在灰度图像上执行,因为它更容易处理。
        Mat edges = new Mat();
        Imgproc.cvtColor(image, edges, Imgproc.COLOR_BGR2GRAY);
        // 对灰度图像应用了高斯模糊(Gaussian Blur)它可以帮助减少图像中的噪声,从而产生更干净的边缘。
        Imgproc.GaussianBlur(edges, edges, new Size(5, 5), 1.5, 1.5);
        // 应用边缘检测算法 输入图像、输出图像和两个阈值
        Imgproc.Canny(image, edges, 100, 200);
        // 显示边缘图像
        HighGui.imshow("Edges", edges);
        HighGui.waitKey();
    }
}

图片属性

import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.imgcodecs.Imgcodecs;

public class Test {

    public static void main(String[] args) {
        // 加载 OpenCV 库
        nu.pattern.OpenCV.loadShared();
        // 加载图像
        Mat image = Imgcodecs.imread("images/_abc.png");
        // 获取图像的宽度和高度
        int width = image.width();
        int height = image.height();
        // 获取图像的通道数(BGR 图像通常为3)
        int numChannels = image.channels();
        // 获取图像的位深度(通常为8位无符号整数)
        int depth = image.depth();
        // 打印图像属性
        System.out.println("Image Width: " + width);
        System.out.println("Image Height: " + height);
        System.out.println("Number of Channels: " + numChannels);
        System.out.println("Image Depth: " + CvType.typeToString(depth));
    }
}
---
Image Width: 150
Image Height: 50
Number of Channels: 3
Image Depth: CV_8UC1

图像旋转

旋转图像以进行校正或调整方向。

import org.opencv.core.Mat;
import org.opencv.core.Point;
import org.opencv.highgui.HighGui;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
public class Test {
    public static void main(String[] args) {
        // 加载 OpenCV 库
        nu.pattern.OpenCV.loadShared();
        // 加载图像
        Mat image = Imgcodecs.imread("images/_abc.png");
        double angle = 30; // 旋转角度
        Point center = new Point(image.cols() / 2, image.rows() / 2);
        Mat rotationMatrix = Imgproc.getRotationMatrix2D(center, angle, 1.0);
        Imgproc.warpAffine(image, image, rotationMatrix, image.size());
        // 显示图像
        HighGui.imshow("Image", image);
        // 等待用户按下任意键关闭窗口
        HighGui.waitKey();
    }
}

图像缩放

调整图像的大小。

Size newSize = new Size(newWidth, newHeight);
Imgproc.resize(image, image, newSize);

图像拼接

将多个图像水平或垂直拼接在一起。

List<Mat> imagesToConcat = new ArrayList<>();
// 添加要拼接的图像到列表中
Mat resultImage = new Mat();
Core.hconcat(imagesToConcat, resultImage); // 或者使用 Core.vconcat 进行垂直拼接

颜色空间转换

将图像从一种颜色空间转换为另一种,例如从 BGR 到 HSV。

Imgproc.cvtColor(image, image, Imgproc.COLOR_BGR2HSV);

图像模糊平滑化

图像模糊(平滑化)是一种图像处理技术,可以减少图像中的噪声或细节,使图像变得更加平滑或模糊。OpenCV 提供了多种图像模糊方法,其中最常见的是高斯模糊和均值模糊。

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class GaussianBlurExample {
    public static void main(String[] args) {
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);

        // 读取图像
        String imagePath = "path/to/your/image.jpg";
        Mat image = Imgcodecs.imread(imagePath);

        if (image.empty()) {
            System.out.println("Could not open or find the image");
            return;
        }

        // 应用高斯模糊
        Imgproc.GaussianBlur(image, image, new org.opencv.core.Size(5, 5), 0);
        // blur均值模糊
        // medianBlur中值模糊
        // bilateralFilter双边模糊

        // 保存模糊后的图像
        String outputImagePath = "path/to/save/blurred_image.jpg";
        Imgcodecs.imwrite(outputImagePath, image);
    }
}

腐蚀和膨胀

膨胀被用来增加图像中边缘的大小。首先,我们定义了奇数(5,5)的核矩阵大小。然后使用内核,我们对图像执行膨胀。

腐蚀与膨胀正好相反。该算法用于减小图像中边缘的大小。首先,我们定义了奇数(5,5)的核矩阵大小。然后使用内核,我们对图像执行腐蚀。

// 膨胀
kernel = np.ones((5,5),np.uint8) ## DEFINING KERNEL OF 5x5
imgDialation = cv2.dilate(imgCanny,kernel,iterations=1) ##DIALATION
// 腐蚀
Mat kernel = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new Size(3, 3));
Imgproc.erode(binaryImage, binaryImage, kernel);

直方图均衡化

提高图像的对比度,使图像更清晰。

Imgproc.cvtColor(image, image, Imgproc.COLOR_BGR2GRAY);
Imgproc.equalizeHist(image, image);

图像分割

将图像分割成不同的区域或对象。

Mat labels = new Mat();
Mat stats = new Mat();
Mat centroids = new Mat();
Imgproc.connectedComponentsWithStats(binaryImage, labels, stats, centroids);

模板匹配

在图像中查找特定模板的位置。

Mat template = Imgcodecs.imread("path/to/template.jpg");
Mat result = new Mat();
Imgproc.matchTemplate(image, template, result, Imgproc.TM_CCOEFF_NORMED);

图像特征提取

使用特征检测器提取图像中的关键点和描述符。

MatOfKeyPoint keypoints = new MatOfKeyPoint();
FeatureDetector detector = FeatureDetector.create(FeatureDetector.SIFT);
detector.detect(image, keypoints);

图像拟合

对图像中的几何形状进行拟合,如拟合直线或圆。

MatOfPoint2f approxCurve = new MatOfPoint2f();
Imgproc.approxPolyDP(new MatOfPoint2f(contour), approxCurve, epsilon, true);

图像标注

在图像上添加文本、线条或形状,以标识或注释图像。

Scalar color = new Scalar(0, 0, 255); // 红色
Point startPoint = new Point(10, 10); // 起始点
Imgproc.putText(image, "Sample Text", startPoint, Core.FONT_HERSHEY_SIMPLEX, 0.5, color, 2);

轮廓检测

查找并绘制图像中的对象轮廓。

List<MatOfPoint> contours = new ArrayList<>();
Imgproc.findContours(binaryImage, contours, new Mat(), Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE);
Imgproc.drawContours(image, contours, -1, new Scalar(0, 255, 0), 2);

背景减除

从图像中分离前景对象和背景。

BackgroundSubtractorMOG2 bgSubtractor = Video.createBackgroundSubtractorMOG2();
Mat foregroundMask = new Mat();
bgSubtractor.apply(image, foregroundMask);

图像混合

将两个图像叠加在一起以创建混合效果。

Mat image1 = Imgcodecs.imread("path/to/image1.jpg");
Mat image2 = Imgcodecs.imread("path/to/image2.jpg");
Mat blendedImage = new Mat();
Core.addWeighted(image1, 0.7, image2, 0.3, 0, blendedImage);

颜色分割

将图像分割成不同的颜色通道。

List<Mat> channels = new ArrayList<>();
Core.split(image, channels);

图像旋转裁剪

旋转并裁剪图像以获取感兴趣的区域。

javaCopy codedouble angle = 30; // 旋转角度
Point center = new Point(image.cols() / 2, image.rows() / 2);
Mat rotationMatrix = Imgproc.getRotationMatrix2D(center, angle, 1.0);
Imgproc.warpAffine(image, image, rotationMatrix, image.size());
Rect roi = new Rect(x, y, width, height); // 定义感兴趣的区域
Mat croppedImage = new Mat(image, roi);

在图像上写文字

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.Point;
import org.opencv.core.Scalar;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
public class WriteTextOnImage {
    public static void main(String[] args) {
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
        // 读取图像
        String imagePath = "path/to/your/image.jpg";
        Mat image = Imgcodecs.imread(imagePath);
        if (image.empty()) {
            System.out.println("Could not open or find the image");
            return;
        }
        // 定义文本和位置
        String text = "Hello, OpenCV!";
        Point position = new Point(50, 50); // 文本的左上角位置
        int fontFace = Imgproc.FONT_HERSHEY_SIMPLEX;
        double fontScale = 1.0;
        Scalar color = new Scalar(0, 0, 255); // 文本颜色 (BGR格式)
        int thickness = 2;
        // 在图像上添加文本
        Imgproc.putText(image, text, position, fontFace, fontScale, color, thickness);
        // 保存带有文本的图像
        String outputImagePath = "path/to/save/output_image.jpg";
        Imgcodecs.imwrite(outputImagePath, image);
    }
}

检测和裁剪人脸

人脸检测在人脸识别系统中非常有用。在 OpenCV 中,我们有许多预先训练的 haar 级联分类器可用于不同的任务。以下网址可以查看 OpenCV GitHub 上的分类器列表:https://github.com/opencv/opencv/tree/master/data/haarca
scades。

我们使用 haarcascade_frontalface_default.xml 分类器来检测图像中的人脸。它将返回图像的四个坐标(w,h,x,y)。使用这些坐标,我们要在脸上画一个矩形,然后使用相同的坐标,继续裁剪人脸。最后使用 imwrite,把裁剪后的图像保存到目录中。

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.Rect;
import org.opencv.core.Scalar;
import org.opencv.core.Size;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
import org.opencv.objdetect.CascadeClassifier;
public class DetectAndCropFace {
    public static void main(String[] args) {
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
        // 加载人脸检测器
        String faceCascadePath = "path/to/haarcascade_frontalface_default.xml";
        CascadeClassifier faceCascade = new CascadeClassifier(faceCascadePath);
        // 读取图像
        String imagePath = "path/to/your/image.jpg";
        Mat image = Imgcodecs.imread(imagePath);
        if (image.empty()) {
            System.out.println("Could not open or find the image");
            return;
        }
        // 转换图像为灰度
        Mat grayImage = new Mat();
        Imgproc.cvtColor(image, grayImage, Imgproc.COLOR_BGR2GRAY);
        Imgproc.equalizeHist(grayImage, grayImage);
        // 检测人脸
        MatOfRect faceDetections = new MatOfRect();
        faceCascade.detectMultiScale(grayImage, faceDetections);
        // 遍历检测到的人脸并裁剪
        for (Rect rect : faceDetections.toArray()) {
            // 裁剪人脸区域
            Mat croppedFace = new Mat(image, rect);
            // 绘制矩形框以标识人脸
            Imgproc.rectangle(image, new Point(rect.x, rect.y), new Point(rect.x + rect.width, rect.y + rect.height), new Scalar(0, 255, 0), 2);
            // 保存裁剪的人脸图像
            String outputImagePath = "path/to/save/face_" + System.currentTimeMillis() + ".jpg";
            Imgcodecs.imwrite(outputImagePath, croppedFace);
        }
        // 保存带有人脸标识的图像
        String outputImagePath = "path/to/save/output_image.jpg";
        Imgcodecs.imwrite(outputImagePath, image);
    }
}

灰度化图像

图像灰度化是一种常见的预处理步骤,可以将彩色图像转换为灰度图像。

import org.opencv.core.Mat;
import org.opencv.highgui.HighGui;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
public class Test {
    public static void main(String[] args) {
        // 加载 OpenCV 库
        nu.pattern.OpenCV.loadShared();
        // 加载彩色图像
        Mat colorImage = Imgcodecs.imread("images/_abc.png");
        // 将彩色图像转换为灰度图像
        Mat grayscaleImage = new Mat();
        Imgproc.cvtColor(colorImage, grayscaleImage, Imgproc.COLOR_BGR2GRAY);
        // 显示灰度图像
        HighGui.imshow("Grayscale Image", grayscaleImage);
        HighGui.waitKey();
    }
}

二值化

二值化是一种图像处理技术,将图像转换为只包含两个像素值的图像,通常为黑色和白色(或0和255),以便更容易进行目标检测、图像分割和其他计算机视觉任务。在 OpenCV 中,可以使用不同的阈值方法来进行二值化。

  1. 简单二值化: 简单二值化是根据一个固定的阈值将图像分为黑白两部分。

    import org.opencv.core.Core;
    import org.opencv.core.Mat;
    import org.opencv.imgcodecs.Imgcodecs;
    import org.opencv.imgproc.Imgproc;
    
    public class SimpleThresholdingExample {
        public static void main(String[] args) {
            System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
    
            // 读取图像
            String imagePath = "path/to/your/image.jpg";
            Mat image = Imgcodecs.imread(imagePath);
    
            if (image.empty()) {
                System.out.println("Could not open or find the image");
                return;
            }
    
            // 将图像转换为灰度
            Mat grayImage = new Mat();
            Imgproc.cvtColor(image, grayImage, Imgproc.COLOR_BGR2GRAY);
    
            // 应用简单二值化
            Mat binaryImage = new Mat();
            Imgproc.threshold(grayImage, binaryImage, 128, 255, Imgproc.THRESH_BINARY);
    
            // 保存二值化后的图像
            String outputImagePath = "path/to/save/binary_image.jpg";
            Imgcodecs.imwrite(outputImagePath, binaryImage);
        }
    }
    
  2. 自适应二值化: 自适应二值化根据每个像素周围的局部区域自动确定阈值。

    import org.opencv.core.Core;
    import org.opencv.core.Mat;
    import org.opencv.imgcodecs.Imgcodecs;
    import org.opencv.imgproc.Imgproc;
    
    public class AdaptiveThresholdingExample {
        public static void main(String[] args) {
            System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
    
            // 读取图像
            String imagePath = "path/to/your/image.jpg";
            Mat image = Imgcodecs.imread(imagePath);
    
            if (image.empty()) {
                System.out.println("Could not open or find the image");
                return;
            }
    
            // 将图像转换为灰度
            Mat grayImage = new Mat();
            Imgproc.cvtColor(image, grayImage, Imgproc.COLOR_BGR2GRAY);
    
            // 应用自适应二值化
            Mat binaryImage = new Mat();
            Imgproc.adaptiveThreshold(grayImage, binaryImage, 255, Imgproc.ADAPTIVE_THRESH_MEAN_C, Imgproc.THRESH_BINARY, 11, 2);
    
            // 保存二值化后的图像
            String outputImagePath = "path/to/save/adaptive_binary_image.jpg";
            Imgcodecs.imwrite(outputImagePath, binaryImage);
        }
    }
    

背景去除

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.Scalar;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.video.BackgroundSubtractor;
import org.opencv.video.Video;
public class RemoveBackground {
    public static void main(String[] args) {
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
        // 读取图像
        String imagePath = "path/to/your/image.jpg";
        Mat image = Imgcodecs.imread(imagePath);

        if (image.empty()) {
            System.out.println("Could not open or find the image");
            return;
        }
        // 创建背景减除器
        BackgroundSubtractor bgSubtractor = Video.createBackgroundSubtractorMOG2();
        // 去除背景
        Mat fgMask = new Mat();
        bgSubtractor.apply(image, fgMask);
        // 创建结果图像
        Mat resultImage = new Mat();
        image.copyTo(resultImage, fgMask);
        // 保存去除背景后的图像
        String outputImagePath = "path/to/save/output_image.jpg";
        Imgcodecs.imwrite(outputImagePath, resultImage);
    }
}

特征点检测

特征点检测是计算机视觉领域的一项重要任务,用于在图像中检测并描述具有独特属性的关键点,以便在不同图像之间进行匹配、跟踪或对象识别。OpenCV 提供了多种特征点检测算法,其中最常用的是 SIFT 和 ORB。

  1. SIFT 特征点检测

    import org.opencv.core.Core;
    import org.opencv.core.Mat;
    import org.opencv.core.MatOfKeyPoint;
    import org.opencv.features2d.Features2d;
    import org.opencv.features2d.SIFT;
    import org.opencv.imgcodecs.Imgcodecs;
    
    public class SiftFeatureDetection {
        public static void main(String[] args) {
            System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
    
            // 读取图像
            String imagePath = "path/to/your/image.jpg";
            Mat image = Imgcodecs.imread(imagePath);
    
            if (image.empty()) {
                System.out.println("Could not open or find the image");
                return;
            }
    
            // 初始化 SIFT 特征检测器
            SIFT sift = SIFT.create();
    
            // 检测图像中的 SIFT 特征点
            MatOfKeyPoint keyPoints = new MatOfKeyPoint();
            sift.detect(image, keyPoints);
    
            // 在图像上绘制特征点
            Mat outputImage = new Mat();
            Features2d.drawKeypoints(image, keyPoints, outputImage);
    
            // 保存带有特征点的图像
            String outputImagePath = "path/to/save/sift_keypoints_image.jpg";
            Imgcodecs.imwrite(outputImagePath, outputImage);
        }
    }
    
  2. ORB 特征点检测

    import org.opencv.core.Core;
    import org.opencv.core.Mat;
    import org.opencv.features2d.Features2d;
    import org.opencv.features2d.ORB;
    import org.opencv.imgcodecs.Imgcodecs;
    
    public class OrbFeatureDetection {
        public static void main(String[] args) {
            System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
    
            // 读取图像
            String imagePath = "path/to/your/image.jpg";
            Mat image = Imgcodecs.imread(imagePath);
    
            if (image.empty()) {
                System.out.println("Could not open or find the image");
                return;
            }
    
            // 初始化 ORB 特征检测器
            ORB orb = ORB.create();
    
            // 检测图像中的 ORB 特征点
            MatOfKeyPoint keyPoints = new MatOfKeyPoint();
            orb.detect(image, keyPoints);
    
            // 在图像上绘制特征点
            Mat outputImage = new Mat();
            Features2d.drawKeypoints(image, keyPoints, outputImage);
    
            // 保存带有特征点的图像
            String outputImagePath = "path/to/save/orb_keypoints_image.jpg";
            Imgcodecs.imwrite(outputImagePath, outputImage);
        }
    }
    

参考

  • https://www.opencv.org.cn/
    • https://www.opencv.org.cn/forum/forum.php?mod=viewthread&tid=33549
    • https://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/tutorials/tutorials.html
  • https://www.hhai.cc/thread-3-1-1.html
  • https://gitee.com/songer/java_opencv
  • https://gitee.com/opencv_ai/opencv_tutorial_data
  • https://gitee.com/endlesshh/opencv343_face_recognition

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1049477.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

大模型Tuning分类

类型总结 微调&#xff08;Fine-tunning&#xff09; 语言模型的参数需要一起参与梯度更新 轻量微调&#xff08;lightweight fine-tunning&#xff09; 冻结了大部分预训练参数&#xff0c;仅添加任务层&#xff0c;语言模型层参数不变 适配器微调 &#xff08;Adapter-t…

Java项目-文件搜索工具

目录 项目背景 项目效果 SQLite的下载安装 使用JDBC操作SQLite 第三方库pinyin4j pinyin4j的具体使用 封装pinyin4j 数据库的设计 创建实体类 实现DBUtil 封装FileDao 设计scan方法 多线程扫描 周期性扫描 控制台版本的客户端 图形化界面 设计图形化界面 项目…

PyTorch - 模型训练损失 (Loss) NaN 问题的解决方案

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/133378367 在模型训练中&#xff0c;如果出现 NaN 的问题&#xff0c;严重影响 Loss 的反传过程&#xff0c;因此&#xff0c;需要加入一些微小值…

什么是 Spring Boot?与传统 Spring 框架的区别

什么是 Spring Boot&#xff1f;与传统 Spring 框架的区别 引言 Spring框架是一个在Java应用程序开发中广泛使用的框架&#xff0c;它提供了一种构建企业级Java应用程序的强大方式。然而&#xff0c;Spring框架在一些方面存在复杂性和繁琐的配置&#xff0c;这促使Spring社区…

leetcode:561. 数组拆分(python3解法)

难度&#xff1a;简单 给定长度为 2n 的整数数组 nums &#xff0c;你的任务是将这些数分成 n 对, 例如 (a1, b1), (a2, b2), ..., (an, bn) &#xff0c;使得从 1 到 n 的 min(ai, bi) 总和最大。 返回该 最大总和 。 示例 1&#xff1a; 输入&#xff1a;nums [1,4,3,2] 输出…

软件设计模式系列之十八——迭代器模式

1 模式的定义 迭代器模式是一种行为型设计模式&#xff0c;它允许客户端逐个访问一个聚合对象中的元素&#xff0c;而不暴露该对象的内部表示。迭代器模式提供了一种统一的方式来遍历不同类型的集合&#xff0c;使客户端代码更加简洁和可复用。 2 举例说明 为了更好地理解迭…

护眼灯买哪种好?分享五款护眼灯

家里顶灯太暗了且高度太高&#xff0c;还是原始的LED灯&#xff0c;晚上用着眼睛都有点难受&#xff0c;还好遇到了儿童护眼灯。下面小编为大家介绍下儿童护眼灯哪个牌子好&#xff1f;什么护眼台灯比较专业 1、色温 台灯的色温也是一个需要考虑的因素&#xff0c;所谓的色温其…

数学建模常用模型

作为数学建模的编程手还掌握一些各类模型常用算法&#xff0c;数学建模评价类模型、分类模型、预测类模型比较常用的方法总结如下&#xff1a; 接下来对这些比较典型的模型进行详细进行介绍说明。 一、评价模型 在数学建模中&#xff0c;评价模型是比较基础的模型之一&#x…

云部署家里的服务器

1.固定静态ip 查看ip地址&#xff0c;en开头的 ifconfig查看路由器ip&#xff0c;via开头的 ip route修改配置文件 cd /etc/netplan/ #来到这个文件夹 sudo cp 01-network-manager-all.yaml 01-network-manager-all.yaml.bak #先备…

ChatGPT架构师:语言大模型的多模态能力、幻觉与研究经验

来源 | The Robot Brains Podcast OneFlow编译 翻译&#xff5c;宛子琳、杨婷 9月26日&#xff0c;OpenAI宣布ChatGPT新增了图片识别和语音能力&#xff0c;使得ChatGPT不仅可以进行文字交流&#xff0c;还可以给它展示图片并进行互动&#xff0c;这是一次ChatGPT向多模态进化的…

基于微信小程序的物流快递信息查询平台同城急送小程序(亮点:寄件、发票申请、在线聊天)

文章目录 前言系统主要功能&#xff1a;具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计…

css画一条0.5px的直线

【css】画一条0.5px的直线_css画一条0.5px的直线_a堅強的泡沫的博客-CSDN博客 一些用来装饰的图形&#xff0c;比如字体的前面或者后面设置图标&#xff0c;画一条线 如果要画很细很细的线&#xff0c;0.5px ,怎么画 用到css3的transform的scaleY(0.5)函数&#xff0c;对象图…

机器人中的数值优化|【七】线性搜索牛顿共轭梯度法、可信域牛顿共轭梯度法

机器人中的数值优化|【七】线性搜索牛顿共轭梯度法、可信域牛顿共轭梯度法 Line Search Newton-CG, Trust Region Newton-CG 往期回顾 机器人中的数值优化|【一】数值优化基础 机器人中的数值优化|【二】最速下降法&#xff0c;可行牛顿法的python实现&#xff0c;以Rosenbro…

快速简单制作Mac系统ISO格式镜像之macOS Sonoma

ISO格式的镜像其实没有什么制作难度&#xff0c;下面苹果系统之家教大家怎么快速简单制作ISO格式的镜像&#xff0c;教程使用到的都是Mac官方的命令。制作好的ISO格式镜像可以用于虚拟机安装或者制作到U盘或者直接在Mac里面打开安装升级。 准备系统镜像 首先下载好macOS 镜像…

如何将matlab中的mat矩阵文件在python中读取出来

先安装hdf5storage这个包 pip3 install hdf5storage 然后在当前目录下放入要读取的mat文件 # 将matlab中的mat文件读取出来 import hdf5storagedata hdf5storage.loadmat(inputWeights.mat) print(data[inputWeights])

C# 自定义控件库之Lable组合控件

1、创建类库 2、在类库中添加用户控件&#xff08;Window窗体&#xff09; 3、控件视图 4、后台代码 namespace UILib {public partial class DeviceInfoV : UserControl{public DeviceInfoV(){InitializeComponent();ParameterInitialize();}#region 初始化private void Par…

SVM(下):如何进行乳腺癌检测?

⭐️⭐️⭐️⭐️⭐️欢迎来到我的博客⭐️⭐️⭐️⭐️⭐️ &#x1f434;作者&#xff1a;秋无之地 &#x1f434;简介&#xff1a;CSDN爬虫、后端、大数据领域创作者。目前从事python爬虫、后端和大数据等相关工作&#xff0c;主要擅长领域有&#xff1a;爬虫、后端、大数据…

KMP算法使用

class Solution {public int strStr(String haystack, String needle) {if (haystack null || needle null || needle.length() < 1 || haystack.length() < needle.length()) {return -1;}int[] nextgetNext(needle.toCharArray());int i0; //指向匹配数组的指针 in…

六、redis安装和配置

一、Windows环境 1、官网下载 2、解压zip包 redis配置文件&#xff1a;redis.windows.conf、redis.windows-service.conf&#xff0c;redis绑定地址以及默认端口配置都可在这两个文件中找到 redis命令行工具 redis-cli&#xff0c;可以启动redis命令行&#xff0c;执行redis…

基于JAVA+SpringBoot的新闻发布平台

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背景介绍&#xff1a; 随着科技的飞速发展和…