• 二、图像处理


    待完善

    一、图片缩放

    import org.bytedeco.opencv.global.opencv_imgcodecs;
    import org.bytedeco.opencv.global.opencv_imgproc;
    import org.bytedeco.opencv.opencv_core.Mat;
    import org.bytedeco.opencv.opencv_core.Size;
    
    public class ImageResizer {
    
        public static void main(String[] args) {
            // 加载图片
            Mat image = opencv_imgcodecs.imread("E://app/images/222.jpg");
            // 图片高度
            System.err.println(image.size().height());
            // 图片宽度
            System.err.println(image.size().width());
    		// 创建Mat
            Mat resizedImage = new Mat();
            // 设置缩放大小
            Size size = new Size(100, 100);
            // 缩放图片, 参数分别是 原图片、新创建的mat、缩放大小
            opencv_imgproc.resize(image, resizedImage, size);
            // 写图片
            opencv_imgcodecs.imwrite("E://app/images/resized.jpg", resizedImage);
    
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    在这里插入图片描述

    二、图片旋转

    import org.bytedeco.opencv.global.opencv_imgcodecs;
    import org.bytedeco.opencv.global.opencv_imgproc;
    import org.bytedeco.opencv.opencv_core.Mat;
    import org.bytedeco.opencv.opencv_core.Point2f;
    
    public class ImageResizer {
    
        public static void main(String[] args) {
            // 加载图片
            Mat image = opencv_imgcodecs.imread("E://app/images/222.jpg");
            Mat rotatedImage = new Mat();
    
            double angle = 90.0;
            // 获取图片中心点
            Point2f center = new Point2f(image.cols() / 2, image.rows() / 2);
            // 三个参数: 中心点,旋转角度, 图片比例
            Mat rotationMatrix = opencv_imgproc.getRotationMatrix2D(center, angle, 1.0);
            // 旋转
            opencv_imgproc.warpAffine(image, rotatedImage, rotationMatrix, image.size());
    	    // 写图片
            opencv_imgcodecs.imwrite("E://app/images/rotated3.jpg", rotatedImage);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    三、边缘检测

    import org.bytedeco.opencv.global.opencv_imgcodecs;
    import org.bytedeco.opencv.global.opencv_imgproc;
    import org.bytedeco.opencv.opencv_core.Mat;
    
    public class ImageResizer {
    
        public static void main(String[] args) {
            // 加载图片
            Mat image = opencv_imgcodecs.imread("E://app/images/222.jpg");
            Mat grayImage = new Mat();
            Mat cannyImage = new Mat();
    		// 灰度设置
            opencv_imgproc.cvtColor(image, grayImage, opencv_imgproc.COLOR_BGR2GRAY);
            // 边缘检测
            opencv_imgproc.Canny(grayImage, cannyImage, 100, 200);
    
            opencv_imgcodecs.imwrite("E://app/images/edges.jpg", grayImage);
            opencv_imgcodecs.imwrite("E://app/images/edges33.jpg", cannyImage);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    在这里插入图片描述

    四、图像腐蚀

    import org.bytedeco.opencv.global.opencv_imgcodecs;
    import org.bytedeco.opencv.global.opencv_imgproc;
    import org.bytedeco.opencv.opencv_core.Mat;
    import org.bytedeco.opencv.opencv_core.Size;
    
    public class ImageResizer {
    
        public static void main(String[] args) {
            // 加载图片
            Mat image = opencv_imgcodecs.imread("E://app/images/222.jpg");
            Mat grayImage = new Mat();
            // 腐蚀程度
            Mat element = opencv_imgproc.getStructuringElement(opencv_imgproc.MORPH_RECT, new Size(15, 15));
            // 腐蚀
            opencv_imgproc.erode(image, grayImage, element);
            opencv_imgcodecs.imwrite("E://app/images/eroded.jpg", grayImage);
    
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    在这里插入图片描述

    五、图像膨胀

    import org.bytedeco.javacv.Java2DFrameConverter;
    import org.bytedeco.javacv.OpenCVFrameConverter;
    import org.bytedeco.opencv.global.opencv_imgproc;
    import org.bytedeco.opencv.opencv_core.Mat;
    import org.bytedeco.opencv.opencv_core.Size;
    
    import javax.imageio.ImageIO;
    import java.awt.image.BufferedImage;
    import java.io.File;
    import java.io.IOException;
    
    public class ImageResizer {
    
    
        public static void main(String[] args) {
            try {
                // 加载图像
                BufferedImage img = ImageIO.read(new File("E://app/images/222.jpg"));
                Java2DFrameConverter java2DFrameConverter = new Java2DFrameConverter();
                Mat inputMat = new OpenCVFrameConverter.ToMat().convert(java2DFrameConverter.convert(img));
                // 定义核
                Mat kernel = opencv_imgproc.getStructuringElement(opencv_imgproc.MORPH_RECT, new Size(15, 15));
                // 膨胀操作
                Mat outputMat = new Mat();
                opencv_imgproc.dilate(inputMat, outputMat, kernel);
                // 保存图像
                Java2DFrameConverter java2DFrameConverterOutput = new Java2DFrameConverter();
                BufferedImage outputImg = java2DFrameConverterOutput
                					.convert(new OpenCVFrameConverter.ToMat().convert(outputMat));
                ImageIO.write(outputImg, "png", new File("E://app/images/output.png"));
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    在这里插入图片描述

    六、裁剪图片

    public class ImageResizer {
    
    
        public static void main(String[] args) {
    
            // 读取图像
            Mat src = opencv_imgcodecs.imread("E://app/images/111.jpg");
    
            // 定义矩形区域
            Rect roi = new Rect(200, 100, 500, 500);
            Rect roi2 = new Rect(100, 100, 500, 500);
            // 裁剪图像
            Mat cropped = new Mat(src, roi);
            Mat cropped2 = new Mat(src, roi2);
            // 保存图像
            opencv_imgcodecs.imwrite("E://app/images/output444.png", cropped);
            opencv_imgcodecs.imwrite("E://app/images/output555.png", cropped2);
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    在这里插入图片描述

    七、翻转图像

    import org.bytedeco.opencv.global.opencv_core;
    import org.bytedeco.opencv.global.opencv_imgcodecs;
    import org.bytedeco.opencv.opencv_core.Mat;
    
    public class ImageResizer {
    
    
        public static void main(String[] args) {
    
            // 读取图像
            Mat src = opencv_imgcodecs.imread("E://app/images/222.jpg");
            // 翻转图像
            Mat dst = new Mat();
            opencv_core.flip(src, dst, 1);
    
            opencv_imgcodecs.imwrite("E://app/images/output555.png", dst);
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    在这里插入图片描述

    八、添加文字

    中文汉字乱码问题未解决

    import org.bytedeco.opencv.global.opencv_imgcodecs;
    import org.bytedeco.opencv.global.opencv_imgproc;
    import org.bytedeco.opencv.opencv_core.Mat;
    import org.bytedeco.opencv.opencv_core.Point;
    import org.bytedeco.opencv.opencv_core.Scalar;
    
    import static org.bytedeco.opencv.global.opencv_imgproc.FONT_HERSHEY_DUPLEX;
    
    public class ImageResizer {
    
    
        public static void main(String[] args) {
    
            // 读取图像
            Mat image1 = opencv_imgcodecs.imread("E://app/images/111.jpg");
            // 设置文字内容和位置
            String text = "Hello, World!";
            Point textOrg = new Point(50, 50);
    
            // 在图像上添加文字
            //img – 显示文字所在图像.
            //text – 待显示的文字.
            //org – 文字在图像中的左下角 坐标.
            // fontFace – 字体类型, 可选择字体:FONT_HERSHEY_SIMPLEX, FONT_HERSHEY_PLAIN, 
            			//FONT_HERSHEY_DUPLEX,FONT_HERSHEY_COMPLEX, FONT_HERSHEY_TRIPLEX, FONT_HERSHEY_COMPLEX_SMALL, 
            			//FONT_HERSHEY_SCRIPT_SIMPLEX, orFONT_HERSHEY_SCRIPT_COMPLEX,
            			//以上所有类型都可以配合 FONT_HERSHEY_ITALIC使用,产生斜体效果。
            //fontScale – 字体大小,该值和字体内置大小相乘得到字体大小
            //color – 文本颜色(默认颜色存储通道为BGR)
            //thickness – 写字的线的粗细,类似于0.38的笔尖和0.5的笔尖
            // lineType – 线性.
            // boo
            opencv_imgproc.putText(image1, text, textOrg, FONT_HERSHEY_DUPLEX, 2.0, new Scalar(250), 1,8, false);
            // 保存带有文字的图像
            opencv_imgcodecs.imwrite("E://app/images/output.png", image1);
    
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

    九、添加水印

    import org.bytedeco.opencv.global.opencv_core;
    import org.bytedeco.opencv.global.opencv_imgcodecs;
    import org.bytedeco.opencv.global.opencv_imgproc;
    import org.bytedeco.opencv.opencv_core.Mat;
    import org.bytedeco.opencv.opencv_core.Size;
    
    public class ImageResizer {
    
    
        public static void main(String[] args) {
    
            // 读取图像
            Mat image = opencv_imgcodecs.imread("E://app/images/111.jpg");
            // 读取水印图像
            Mat watermark = opencv_imgcodecs.imread("E://app/images/666.jpg");
            
            Size size = new Size(1000, 1000);
            // 两张图片大小必须一致
            Mat resizedImage = new Mat();
            Mat waterResizedImage = new Mat();
            opencv_imgproc.resize(image, resizedImage, size);
            opencv_imgproc.resize(watermark, waterResizedImage, size);
    
            // 将水印图像复制到原始图像上
            Mat image_with_watermark = new Mat();
            opencv_core.addWeighted(resizedImage, 0.7, waterResizedImage, 0.3, 0, image_with_watermark);
            // 保存带有文字的图像
            opencv_imgcodecs.imwrite("E://app/images/output.png", image_with_watermark);
    
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    十、模糊

    import org.bytedeco.opencv.global.opencv_core;
    import org.bytedeco.opencv.global.opencv_imgcodecs;
    import org.bytedeco.opencv.global.opencv_imgproc;
    import org.bytedeco.opencv.opencv_core.Mat;
    import org.bytedeco.opencv.opencv_core.Size;
    
    
    public class ImageResizer {
        
        public static void main(String[] args) {
            // 读取图像
            Mat image = opencv_imgcodecs.imread("E://app/images/222.jpg");
            Mat dst = new Mat();
            opencv_imgproc.GaussianBlur(image, dst, new Size(15, 15), 0, 0, opencv_core.BORDER_DEFAULT);
            // 保存
            opencv_imgcodecs.imwrite("E://app/images/output.jpg", dst);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    十一、锐化

    import org.bytedeco.opencv.global.opencv_core;
    import org.bytedeco.opencv.global.opencv_imgcodecs;
    import org.bytedeco.opencv.global.opencv_imgproc;
    import org.bytedeco.opencv.opencv_core.Mat;
    import org.bytedeco.opencv.opencv_core.Size;
    
    
    public class ImageResizer {
    
        public static void main(String[] args) {
            // 读取图像
            Mat image = opencv_imgcodecs.imread("E://app/images/222.jpg");
            Mat dst = new Mat();
    
            Mat sharpen = new Mat();
    
            opencv_imgproc.GaussianBlur(image, sharpen, new Size(0, 0), 3);
            opencv_core.addWeighted(image, 1.5, sharpen, -0.5, 0, dst);
            // 保存
            opencv_imgcodecs.imwrite("E://app/images/output.jpg", dst);
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    十二、颜色

    import org.bytedeco.opencv.global.opencv_imgcodecs;
    import org.bytedeco.opencv.global.opencv_imgproc;
    import org.bytedeco.opencv.opencv_core.Mat;
    
    
    public class ImageResizer {
    
        public static void main(String[] args) {
            // 读取图像
            Mat image = opencv_imgcodecs.imread("E://app/images/222.jpg");
            Mat dst = new Mat();
    
            opencv_imgproc.cvtColor(image, dst, opencv_imgproc.COLOR_RGB2XYZ);
            // 保存带有文字的图像
            opencv_imgcodecs.imwrite("E://app/images/output.jpg", dst);
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    十三、识别人脸

    无法识别卡通人物

    第一种:

    import org.bytedeco.opencv.global.opencv_imgcodecs;
    import org.bytedeco.opencv.global.opencv_imgproc;
    import org.bytedeco.opencv.opencv_core.*;
    import org.bytedeco.opencv.opencv_objdetect.CascadeClassifier;
    import org.opencv.core.Core;
    
    
    public class ImageResizer {
    
        public static void main(String[] args) {
    
            System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
    
            // 加载图像
            Mat image = opencv_imgcodecs.imread("E://app/images/555.jpeg");
    
            // 创建人脸分类器
            CascadeClassifier faceCascade = new CascadeClassifier(
                    "E://app/images/haarcascades/haarcascade_frontalface_alt2.xml");
    
            // 检测到的人脸
            RectVector faces = new RectVector();
            //多人脸检测
            faceCascade.detectMultiScale(image, faces);
    
            // 绘制矩形框显示人脸
            for (Rect rect : faces.get()) {
                opencv_imgproc.rectangle(
                        image, 
                        new Point(rect.x(), rect.y()), 
                        new Point(rect.x() + rect.width(), rect.y() + rect.height()), 
                        new Scalar(0, 255, 0, 0));
            }
    
            // 保存图像
            opencv_imgcodecs.imwrite("E://app/images/face_output.jpg", image);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

    第二种:

    import org.bytedeco.javacv.Frame;
    import org.bytedeco.javacv.Java2DFrameConverter;
    import org.bytedeco.javacv.OpenCVFrameConverter;
    import org.bytedeco.opencv.global.opencv_imgproc;
    import org.bytedeco.opencv.opencv_core.*;
    import org.bytedeco.opencv.opencv_objdetect.CascadeClassifier;
    
    import javax.imageio.ImageIO;
    import java.awt.image.BufferedImage;
    import java.io.File;
    import java.io.IOException;
    
    import static org.bytedeco.opencv.global.opencv_imgproc.*;
    
    public class PictureService {
    
        public static void main(String[] args) throws IOException {
            String filePath = "E://app/images/333.jpg";
            // 读取opencv人脸检测器
            CascadeClassifier cascade = new 
            			CascadeClassifier("E://app/images/haarcascades/haarcascade_frontalface_alt2.xml");
            File file = new File(filePath);
            BufferedImage image = ImageIO.read(file);
            Java2DFrameConverter imageConverter = new Java2DFrameConverter();
            Frame frame = imageConverter.convert(image);
            //类型转换
            OpenCVFrameConverter.ToMat converter = new OpenCVFrameConverter.ToMat();
            Mat original = converter.convertToMat(frame);
            //存放灰度图
            Mat grayImg = new Mat();
            //模式设置成ImageMode.Gray下不需要再做灰度 摄像头获取的是彩色图像,所以先灰度化下
            cvtColor(original, grayImg, COLOR_BGRA2GRAY);
            // 均衡化直方图
            equalizeHist(grayImg, grayImg);
            // 检测到的人脸
            RectVector faces = new RectVector();
            //多人脸检测
            cascade.detectMultiScale(grayImg, faces);
            // 遍历人脸
            for (Rect rect : faces.get()) {
                //绘制人脸矩形区域,scalar色彩顺序:BGR(蓝绿红)
                opencv_imgproc.rectangle(original, rect, new Scalar(0, 255, 0, 1));
                int pos_x = Math.max(rect.tl().x() - 10, 0);
                int pos_y = Math.max(rect.tl().y() - 10, 0);
                // 在人脸矩形上方绘制提示文字(中文会乱码)
                putText(original, "people face", new Point(pos_x, pos_y), 
                			FONT_HERSHEY_COMPLEX, 1.0, new Scalar(0, 0, 255, 2.0));
            }
            frame = converter.convert(original);
            image = imageConverter.convert(frame);
            String fileName = file.getName();
            String extension = fileName.substring(fileName.lastIndexOf(".") + 1);
            String newFileName = fileName.substring(0, fileName.lastIndexOf(".")) + "_result." + extension;
            ImageIO.write(image, extension, new File(file.getParent() + File.separator + newFileName));
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
  • 相关阅读:
    YOLOv7改进:ConvNeXt(backbone改为CNeB)
    pycharm远程连接Linux服务器
    题目0158-快递业务站
    687 最长同值路径——Leetcode 天天刷(2022.9.2)【DFS】
    有关神经网络的训练算法,人工神经网络优化算法
    总建面64万平,配3所幼儿园+54班九年制学校,坪山江岭竹元规划
    Linux命令(93)之head
    深入解剖线程池(ThreadPoolExecutor)
    JSONObject的底层原理&&常见方法的使用以及项目中的使用场景
    python+Web自动化打包exe+配置文件
  • 原文地址:https://blog.csdn.net/qq_38618691/article/details/133633154