二、图像处理

待完善

一、图片缩放

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);

    }
}

在这里插入图片描述

二、图片旋转

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);
    }
}

三、边缘检测

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);
    }
}

在这里插入图片描述

四、图像腐蚀

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);

    }
}

在这里插入图片描述

五、图像膨胀

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();
        }
    }
}

在这里插入图片描述

六、裁剪图片

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);
    }
}

在这里插入图片描述

七、翻转图像

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);
    }
}

在这里插入图片描述

八、添加文字

中文汉字乱码问题未解决

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);

    }
}

九、添加水印

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);

    }
}

十、模糊

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);
    }
}

十一、锐化

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);
    }
}

十二、颜色

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);
    }
}

十三、识别人脸

无法识别卡通人物

第一种:

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);
    }
}

第二种:

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));
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值