Java调用Opencv及处理并行化

一、开发环境配置

IDE及开发环境的配置不做详细描述,网上参考文档很多,参考链接1为一个示例


二、使用Java调用OpenCV java API进行图片缩放

main.java文件内容如下

import java.io.File;
import org.opencv.core.*;
import org.opencv.imgcodecs.*;
import org.opencv.imgproc.Imgproc;

public class main {
    static {System.loadLibrary (Core.NATIVE_LIBRARY_NAME);}

    public static void run_test_case (File infile, File outfile, int resize_width, int resize_height) {
        Mat out_img = new Mat();

        Size size = Imgcodecs.imsize (infile.getAbsolutePath());

        double w_ratio = (double) resize_width / size.width;
        double h_ratio = (double) resize_height / size.height;

        double ratio = (size.width * h_ratio > resize_width) ? h_ratio : w_ratio;

        resize_width = (int) (size.width * ratio + 0.5);
        resize_height = (int) (size.height * ratio + 0.5);

        Mat in_img = Imgcodecs.imread (infile.getAbsolutePath());
        Imgproc.resize (in_img, out_img, new Size (resize_width, resize_height), 0, 0, Imgproc.INTER_LANCZOS4);

        Imgcodecs.imwrite (outfile.getAbsolutePath(), out_img);

        System.out.println (out_img);
    }



    public static void main (String[] args) {
        if (args.length != 5) {
            System.out.println ("Usage:java main input_file|input_dir output_file|output_dir resize_width resize_height");
            return;
        }

        // Get parameters
        File infile = new File (args[0]);
        File outfile = new File (args[1]);
        int resize_width = Integer.parseInt (args[2]);
        int resize_height = Integer.parseInt (args[3]);;

        //time stamp
        long time_start, time_end, time_diff;

        //process
        if (infile.isFile()) {
            time_start = System.currentTimeMillis();

            run_test_case (infile, outfile, resize_width, resize_height);

            time_end = System.currentTimeMillis();
            time_diff = time_end - time_start;
            System.out.println ("time = " + time_diff / 1000.0 + "s\n");
        }
        else if (infile.isDirectory()) {
            if (outfile.exists() == false) {
                outfile.mkdirs();
            }

            String[] files = infile.list();

            time_start = System.currentTimeMillis();

            // omp parallel for threadNum(56)
            for (int i = 0; i < files.length; i++) {
                File in_file = new File (infile.getAbsolutePath() + "/" + files[i]);
                File out_file = new File (outfile.getAbsolutePath() + "/" + files[i]);
                run_test_case (in_file, out_file, resize_width, resize_height);
            }

            time_end = System.currentTimeMillis();
            time_diff = time_end - time_start;
            System.out.println ("time = " + time_diff / 1000.0 + "s\n");
        }


        // omp parallel
        {
           System.out.println("Thread #" + OMP4J_THREAD_NUM + "/" + OMP4J_NUM_THREADS);
        }
    }

}


并行化处理:

使用omp4j进行了for循环的并行化处理,也可以使用Jomp。

下载omp4j-1.2.jar,并在启动脚本中设置目录参数



启动脚本如下:

#!/bin/bash -eu

OPENCV_JAR_DIR=/usr/local/share/OpenCV/java/opencv-310.jar
OMP4J='java -jar ./lib/omp4j-1.2.jar'

#compile
#javac -cp .:$OPENCV_JAR_DIR main.java
$OMP4J -cp .:$OPENCV_JAR_DIR main.java

#run
java -cp .:$OPENCV_JAR_DIR main input.jpg output.jpg 1080 1080



参考:

1.https://segmentfault.com/a/1190000000358809#articleHeader0

2.http://docs.opencv.org/java/3.1.0/

3.http://www.omp4j.org/home

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值