最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot使用OpenCV的超詳細(xì)步驟

 更新時(shí)間:2024年04月30日 08:53:28   作者:Lovme_du  
最近有個(gè)項(xiàng)?需要對(duì)圖?圖像進(jìn)?處理,使?到了開源框架OpenCV,所以下面這篇文章主要給大家介紹了關(guān)于SpringBoot使用OpenCV的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下

Spring boot 整合 OpenCV 4.5

本文展示W(wǎng)indows下Spring Boot 整合Opencv 4.5 進(jìn)行對(duì)圖片中的人臉提取,開發(fā)工具IDEA。

環(huán)境安裝

1、下載opencv安裝包【下載地址】  或者點(diǎn)擊這里下載最新版

2、下載后運(yùn)行exe、安裝。

配置spring boot項(xiàng)目

1、創(chuàng)建空白spring boot項(xiàng)目,jar放入如下圖,pom添加依賴。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>OpenCVStudy</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>pom</packaging>

    <name>OpenCVStudy</name>
    <description>項(xiàng)目骨架</description>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.6.RELEASE</version>
        <relativePath/>
    </parent>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <spring-cloud.version>Finchley.SR1</spring-cloud.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!--openCV 依賴包-->
        <dependency>
            <groupId>org.opencv</groupId>
            <artifactId>opencv</artifactId>
            <version>4.5.1</version>
            <scope>system</scope>
            <systemPath>${project.basedir}/src/main/resources/lib/opencv-451.jar</systemPath>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
    <repositories>
        <repository>
            <id>gfs-maven-snapshot-repository</id>
            <name>gfs-maven-snapshot-repository</name>
            <url>https://raw.githubusercontent.com/gefangshuai/maven/master/</url>
        </repository>
    </repositories>
</project>

2、opencv\build\java目錄的dll,opencv\sources\data\haarcascades數(shù)據(jù)集,按圖存放。

3、測(cè)試代碼

創(chuàng)建類 StreamUtils.java

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.awt.image.DataBufferByte;
import java.io.ByteArrayInputStream;
import java.io.IOException;


public class StreamUtils {
    /**
     * 裝換回編碼
     *
     * @param correctMat
     * @return
     */
    public static String catToBase64(Mat correctMat) {
        return bufferToBase64(toByteArray(correctMat));
    }

    /**
     * 轉(zhuǎn)換成base64編碼
     *
     * @param buffer
     * @return
     */
    public static String bufferToBase64(byte[] buffer) {
        return Base64Utils.encodeToString(buffer);
    }

    /**
     * base64編碼轉(zhuǎn)換成字節(jié)數(shù)組
     *
     * @param base64Str
     * @return
     */
    public static byte[] base64ToByteArray(String base64Str) {
        return Base64Utils.decodeFromString(base64Str);
    }

    /**
     * base64 編碼轉(zhuǎn)換為 BufferedImage
     *
     * @param base64
     * @return
     */
    public static BufferedImage base64ToBufferedImage(String base64) {
        BASE64Decoder Base64 = new BASE64Decoder();
        try {
            byte[] bytes1 = Base64.decodeBuffer(base64);
            ByteArrayInputStream bais = new ByteArrayInputStream(bytes1);
            return ImageIO.read(bais);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * mat轉(zhuǎn)換成bufferedImage
     *
     * @param matrix
     * @return
     */
    public static byte[] toByteArray(Mat matrix) {
        MatOfByte mob = new MatOfByte();
        Imgcodecs.imencode(".jpg", matrix, mob);
        return mob.toArray();
    }

    /**
     * mat轉(zhuǎn)換成bufferedImage
     *
     * @param matrix
     * @return
     */
    public static BufferedImage toBufferedImage(Mat matrix) throws IOException {
        byte[] buffer = toByteArray(matrix);
        ByteArrayInputStream bais = new ByteArrayInputStream(buffer);
        return ImageIO.read(bais);
    }

    /**
     * base64轉(zhuǎn)Mat
     *
     * @param base64
     * @return
     * @throws IOException
     */
    public static Mat base642Mat(String base64) {
        return bufImg2Mat(base64ToBufferedImage(base64), BufferedImage.TYPE_3BYTE_BGR, CvType.CV_8UC3);
    }

    /**
     * BufferedImage轉(zhuǎn)換成Mat
     *
     * @param original 要轉(zhuǎn)換的BufferedImage
     * @param imgType  bufferedImage的類型 如 BufferedImage.TYPE_3BYTE_BGR
     * @param matType  轉(zhuǎn)換成mat的type 如 CvType.CV_8UC3
     */
    public static Mat bufImg2Mat(BufferedImage original, int imgType, int matType) {
        if (original == null) {
            throw new IllegalArgumentException("original == null");
        }
        // Don't convert if it already has correct type
        if (original.getType() != imgType) {
            // Create a buffered image
            BufferedImage image = new BufferedImage(original.getWidth(), original.getHeight(), imgType);
            // Draw the image onto the new buffer
            Graphics2D g = image.createGraphics();
            try {
                g.setComposite(AlphaComposite.Src);
                g.drawImage(original, 0, 0, null);
                original = image;
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                g.dispose();
            }
        }
        byte[] pixels = ((DataBufferByte) original.getRaster().getDataBuffer()).getData();
        Mat mat = Mat.eye(original.getHeight(), original.getWidth(), matType);
        mat.put(0, 0, pixels);
        return mat;
    }
}

測(cè)試代碼

    public static String markFace(String base64Images) {
        String path = System.getProperty("user.dir").concat("/haarcascades/haarcascade_frontalface_alt.xml");
        CascadeClassifier faceDetector = new CascadeClassifier(path);
        MatOfRect faceDetections = new MatOfRect();
        Mat mat = StreamUtils.base642Mat(base64Images);
        faceDetector.detectMultiScale(mat, faceDetections);
        if (faceDetections.toArray().length > 0) {
            for (Rect rect : faceDetections.toList()) {
                Imgproc.rectangle(mat, new Point(rect.x, rect.y), new Point(rect.x + rect.width, rect.y + rect.height), new Scalar(0, 255, 0), 3);
            }
        }
        return StreamUtils.catToBase64(mat);
    }
    
    public static void main(String[] args) {
        String base64Img = "";
        String base64Back = markFace(base64Img);
    }

OpenCV 訓(xùn)練自己的模型,實(shí)現(xiàn)特定物體的識(shí)別

opencv 3.4版本才能有訓(xùn)練器文件,4.5版本去掉了;但是訓(xùn)練出的數(shù)據(jù)集能通用。本人喜歡用新版,前面介紹使用的是高版本,訓(xùn)練自己的模型必須用3.4.X版本的。

環(huán)境安裝

1、下載opencv安裝包【下載地址】

2、下載后選擇目錄安裝,提取文件到本地,檢查是否存在目錄。

前期準(zhǔn)備

1、正樣本數(shù)據(jù)圖片5張(image\positive\img);創(chuàng)建文件info.dat(image\positive)并編輯如下內(nèi)容。

img/1.jpg 1 0 0 55 55
img/2.jpg 1 0 0 55 55
img/3.jpg 1 0 0 55 55
img/4.jpg 1 0 0 55 55
img/5.jpg 1 0 0 55 55

2、負(fù)樣本數(shù)據(jù)圖片5張(image\negitive\img);創(chuàng)建bg.txt文件并編輯如下內(nèi)容。

D:\tools\OpenCV\xl\image\negitive\img\1.jpg
D:\tools\OpenCV\xl\image\negitive\img\2.jpg
D:\tools\OpenCV\xl\image\negitive\img\3.jpg
D:\tools\OpenCV\xl\image\negitive\img\4.jpg
D:\tools\OpenCV\xl\image\negitive\img\5.jpg

3、cmd執(zhí)行,生成sample.vec文件;

> D:\tools\OpenCV\opencv3.4\opencv\build\x64\vc15\bin\opencv_createsamples.exe -info D:\tools\OpenCV\xl\image\positive\info.dat -vec D:\tools\OpenCV\xl\image\sample.vec -num 5 -bgcolor 0 -bgthresh 0 -w 24 -h 24

4、生成的sample.vec和bg.txt拷貝到opencv_traincascade.exe同級(jí)目錄(opencv有這個(gè)bug,不能指定目錄,不然會(huì)產(chǎn)生報(bào)錯(cuò)),cmd執(zhí)行;

注意:numPos 不能為正樣本數(shù)量,只能小于實(shí)際數(shù)量。numNeg為負(fù)樣本數(shù)量,可以大于實(shí)際數(shù)量

D:\tools\OpenCV\opencv3.4\opencv\build\x64\vc15\bin\opencv_traincascade.exe -data D:\tools\OpenCV\xl\image -vec sample.vec -bg bg.txt -numPos 3 -numNeg 7 -numStages 12 -feattureType HAAR -w 24 -h 24 -minHitRate 0.995 -maxFalseAlarmRate 0.5

執(zhí)行結(jié)果:

PARAMETERS:
cascadeDirName: D:\tools\OpenCV\xl\image
vecFileName: sample.vec
bgFileName: bg.txt
numPos: 4
numNeg: 7
numStages: 12
precalcValBufSize[Mb] : 1024
precalcIdxBufSize[Mb] : 1024
acceptanceRatioBreakValue : -1
stageType: BOOST
featureType: HAAR
sampleWidth: 24
sampleHeight: 24
boostType: GAB
minHitRate: 0.995
maxFalseAlarmRate: 0.5
weightTrimRate: 0.95
maxDepth: 1
maxWeakCount: 100
mode: BASIC
Number of unique features given windowSize [24,24] : 162336

===== TRAINING 0-stage =====
<BEGIN
POS count : consumed   4 : 4
NEG count : acceptanceRatio    7 : 1
Precalculation time: 0.008
+----+---------+---------+
|  N |    HR   |    FA   |
+----+---------+---------+
|   1|        1|        0|
+----+---------+---------+
END>
Training until now has taken 0 days 0 hours 0 minutes 0 seconds.

===== TRAINING 1-stage =====
<BEGIN
POS count : consumed   4 : 4
NEG count : acceptanceRatio    7 : 0.875
Precalculation time: 0.008
+----+---------+---------+
|  N |    HR   |    FA   |
+----+---------+---------+
|   1|        1|        0|
+----+---------+---------+
END>
Training until now has taken 0 days 0 hours 0 minutes 0 seconds.

===== TRAINING 2-stage =====
<BEGIN
POS count : consumed   4 : 4
NEG count : acceptanceRatio    7 : 0.636364
Precalculation time: 0.008
+----+---------+---------+
|  N |    HR   |    FA   |
+----+---------+---------+
|   1|        1|        0|
+----+---------+---------+
END>
Training until now has taken 0 days 0 hours 0 minutes 0 seconds.

===== TRAINING 3-stage =====
<BEGIN
POS count : consumed   4 : 4
NEG count : acceptanceRatio    7 : 0.01983
Precalculation time: 0.008
+----+---------+---------+
|  N |    HR   |    FA   |
+----+---------+---------+
|   1|        1|        0|
+----+---------+---------+
END>
Training until now has taken 0 days 0 hours 0 minutes 0 seconds.

===== TRAINING 4-stage =====
<BEGIN
POS count : consumed   4 : 4
NEG count : acceptanceRatio    7 : 0.00266565
Precalculation time: 0.007
+----+---------+---------+
|  N |    HR   |    FA   |
+----+---------+---------+
|   1|        1|        0|
+----+---------+---------+
END>
Training until now has taken 0 days 0 hours 0 minutes 0 seconds.

===== TRAINING 5-stage =====
<BEGIN
POS count : consumed   4 : 4
NEG count : acceptanceRatio    0 : 0
Required leaf false alarm rate achieved. Branch training terminated.

5、執(zhí)行完生成 cascade.xml

6、創(chuàng)建測(cè)試代碼使用,可行。

 public static String cascade(String base64Images) {
        String path = System.getProperty("user.dir").concat("/haarcascades/cascade.xml");
        CascadeClassifier faceDetector = new CascadeClassifier(path);
        MatOfRect faceDetections = new MatOfRect();
        Mat mat = StreamUtils.base642Mat(base64Images);
        faceDetector.detectMultiScale(mat, faceDetections);
        if (faceDetections.toArray().length > 0) {
            for (Rect rect : faceDetections.toList()) {
                Imgproc.rectangle(mat, new Point(rect.x, rect.y), new Point(rect.x + rect.width, rect.y + rect.height), new Scalar(0, 255, 0), 3);
            }
        }
        return StreamUtils.catToBase64(mat);
    }

    public static void main(String[] args) {
        String base64Img = "";
        String base64Back = cascade(base64Img);
    }

總結(jié)

本文只是學(xué)習(xí)如何訓(xùn)練自己模型,選用正本和反面數(shù)據(jù)較小,實(shí)際項(xiàng)目中需要選用大量得樣本數(shù)據(jù)圖片。

到此這篇關(guān)于SpringBoot使用OpenCV的文章就介紹到這了,更多相關(guān)SpringBoot使用OpenCV內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 簡(jiǎn)單談?wù)凧ava垃圾回收

    簡(jiǎn)單談?wù)凧ava垃圾回收

    本文是看了James Gosling的<<Java程序設(shè)計(jì)語(yǔ)言>>后結(jié)合自己的一些項(xiàng)目經(jīng)驗(yàn),簡(jiǎn)單總結(jié)下關(guān)于java的垃圾回收問題的看法,有需要的小伙伴可以參考下
    2016-05-05
  • MyBatis-plus聚合查詢、表關(guān)聯(lián)、條件更新實(shí)踐

    MyBatis-plus聚合查詢、表關(guān)聯(lián)、條件更新實(shí)踐

    文章描述了一個(gè)圖書館系統(tǒng)的操作流程,首先查詢預(yù)約數(shù)量,其次關(guān)聯(lián)查詢可預(yù)約書籍并發(fā)出通知,最后更新書刊狀態(tài)為下架,輸出每步操作的SQL日志
    2026-05-05
  • java簡(jiǎn)單操作word實(shí)例

    java簡(jiǎn)單操作word實(shí)例

    這篇文章主要為大家詳細(xì)介紹了java簡(jiǎn)單操作word實(shí)例,感興趣的朋友可以參考一下
    2016-03-03
  • java編程實(shí)現(xiàn)簡(jiǎn)單的網(wǎng)絡(luò)爬蟲示例過程

    java編程實(shí)現(xiàn)簡(jiǎn)單的網(wǎng)絡(luò)爬蟲示例過程

    這篇文章主要為大家介紹了如何使用java編程實(shí)現(xiàn)一個(gè)簡(jiǎn)單的網(wǎng)絡(luò)爬蟲示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2021-10-10
  • Springboot整合JwtHelper實(shí)現(xiàn)非對(duì)稱加密

    Springboot整合JwtHelper實(shí)現(xiàn)非對(duì)稱加密

    本文主要介紹了Springboot整合JwtHelper實(shí)現(xiàn)非對(duì)稱加密,主要介紹兩種方式,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-03-03
  • Java線程池隊(duì)列LinkedBlockingDeque

    Java線程池隊(duì)列LinkedBlockingDeque

    這篇文章主要為大家介紹了Java線程池隊(duì)列LinkedBlockingDeque示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • Java?file.delete刪除文件失敗,Windows磁盤出現(xiàn)無法訪問的文件問題

    Java?file.delete刪除文件失敗,Windows磁盤出現(xiàn)無法訪問的文件問題

    這篇文章主要介紹了Java?file.delete刪除文件失敗,Windows磁盤出現(xiàn)無法訪問的文件問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • 基于java文本復(fù)制的7種方式總結(jié)

    基于java文本復(fù)制的7種方式總結(jié)

    下面小編就為大家分享一篇基于java文本復(fù)制的7種方式總結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-01-01
  • Spark使用IDEA編寫wordcount的示例演示

    Spark使用IDEA編寫wordcount的示例演示

    這篇文章主要介紹了Spark使用IDEA編寫wordcount的示例演示,本文通過示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-07-07
  • Spring Bean實(shí)例的創(chuàng)建及構(gòu)造器的挑選

    Spring Bean實(shí)例的創(chuàng)建及構(gòu)造器的挑選

    這篇文章主要介紹了Spring Bean實(shí)例的創(chuàng)建及構(gòu)造器的挑選,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴們有很好的幫助,需要的朋友可以參考下
    2021-04-04

最新評(píng)論

乌兰察布市| 高邮市| 九江市| 云南省| 宿松县| 福建省| 祁连县| 双牌县| 茂名市| 略阳县| 昌乐县| 齐河县| 凤庆县| 黄浦区| 福建省| 怀柔区| 福州市| 乐至县| 洛扎县| 澄城县| 吉安县| 旬邑县| 筠连县| 红河县| 醴陵市| 天镇县| 渭源县| 龙州县| 霍林郭勒市| 宕昌县| 江川县| 襄樊市| 长治县| 南涧| 大港区| 屏东县| 灌南县| 游戏| 赤水市| 辽源市| 定边县|