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

Java圖像處理之獲取用戶感興趣的區(qū)域

 更新時間:2022年07月29日 15:58:25   作者:weiambt  
OpenCV(Open?Source?Computer?Vision?Library)是一個開源的計算機視覺庫,它提供了很多函數(shù),這些函數(shù)非常高效地實現(xiàn)了計算機視覺算法。本文將利用OpenCV實現(xiàn)獲取用戶感興趣的區(qū)域,從而達到摳圖效果

需求背景

獲取ROI圖片:現(xiàn)在有一張圖片,用戶能夠在坐標(biāo)上選擇一些點組成一個區(qū)域,這個區(qū)域稱為用戶感興趣的區(qū)域,需要利用mask掩膜生成,需要生成mask圖片、ROI圖片,要求使用OpenCV+Java實現(xiàn)。

概念解釋

ROI

ROI: region of interest 感興趣的區(qū)域

openCV

OpenCV(Open Source Computer Vision Library)是一個開源的計算機視覺庫,它提供了很多函數(shù),這些函數(shù)非常高效地實現(xiàn)了計算機視覺算法。

掩膜mask

什么是圖像處理中的mask(遮罩),OpenCV中是如此定義Mask的:八位單通道的Mat對象,每個像素點值為零或者非零區(qū)域。當(dāng)Mask對象添加到圖像區(qū)上時,只有非零的區(qū)域是可見,Mask中所有像素值為零與圖像重疊的區(qū)域就會不可見,也就是說Mask區(qū)域的形狀與大小直接決定了你看到最終圖像的大小與形狀。

可以看出,mask的作用是可以幫助我們提取各種不規(guī)則的區(qū)域。

代碼實現(xiàn)

import org.opencv.core.*;
import org.opencv.core.Point;
import org.opencv.imgproc.Imgproc;
import java.util.ArrayList;
import java.util.List;
public class MyTest{
    /**
     * demo:根據(jù)原圖片生成mask,再根據(jù)mask生成ROI圖片
     */
    @Test
    public void testCreateROI() throws IOException {
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
        Mat img = Imgcodecs.imread("C:\\Users\\Administrator\\Desktop\\20220720141206.jpg");

        //定義mask的區(qū)域邊界點
        List<Point> list = new ArrayList<>();
        list.add(new Point(600, 50));
        list.add(new Point(400, 500));
        list.add(new Point(1000, 550));
        list.add(new Point(1200, 50));

//        list.add(new Point(0,0));
//        list.add(new Point(1296,0));
//        list.add(new Point(1296,960));
//        list.add(new Point(0,960));

        // 構(gòu)建掩膜mask
        List<MatOfPoint> maskArea = new ArrayList<>();
        MatOfPoint maskPoints = new MatOfPoint();
        maskPoints.fromList(list);
        maskArea.add(maskPoints);
        Mat mask;
        mask = new Mat(new Size(img.width(), img.height()), CvType.CV_8UC3, new Scalar(0, 0, 0));//定義成黑色
        Imgproc.fillPoly(mask, maskArea, new Scalar(255, 255, 255));//填充多邊形,生成mask,定義成白色
        // 保存mask圖片
        Imgcodecs.imwrite("C:\\Users\\Administrator\\Desktop\\mask.tiff", mask);

        //根據(jù)mask將原圖片img復(fù)制生成ROI圖片dist
        Mat dist = new Mat(new Size(img.width(), img.height()), CvType.CV_8UC3, new Scalar(0, 0, 0));
        img.copyTo(dist, mask);
        Imgcodecs.imwrite("C:\\Users\\Administrator\\Desktop\\dist.tiff", dist);
    }
}

效果如下

原圖片:

mask圖片:

ROI圖片:

工具類

方法聲明

//方法1:生成mask
public static Mat create(int width, int height, String filePath, List<PointParam> points);
//方法2:根據(jù)mask生成ROI圖片
public static void solve(Mat mask, String strFrom, String strTo);

ImageSolveByOpenCV 類

package com.example.phenocam.test;

import lombok.extern.slf4j.Slf4j;
import org.opencv.core.*;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
import java.util.ArrayList;
import java.util.List;

/**
 * 通過 OpenCV 創(chuàng)建一張mask,根據(jù)mask生成ROI圖片
 */

@Slf4j
public class ImageSolveByOpenCV {

	static {
		System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
	}

	/**
	 * 	  創(chuàng)建一個掩膜
	 * 	  @param width: 圖片的寬度
	 * 	  @param height: 圖片的高度
	 * 	  @param filePath: 文件保存的路徑
	 * 	  @param points: 輪廓的頂點
	 *    @return mask圖片的mat格式
	 */

	public static Mat create(int width, int height, String filePath, List<PointParam> points) {
		// 對輸入的點進行預(yù)處理
		List<org.opencv.core.Point> list = new ArrayList<>();
		for (PointParam p : points) {
			list.add(new org.opencv.core.Point(p.getX(), p.getY()));
		}

		// 創(chuàng)建掩膜區(qū)域
		List<MatOfPoint> maskArea = new ArrayList<>();
		MatOfPoint maskPoints = new MatOfPoint();
		maskPoints.fromList(list);
		maskArea.add(maskPoints);

		// 構(gòu)建掩膜
		Mat mask = new Mat(new Size(width, height), CvType.CV_8UC3, new Scalar(0, 0, 0));
		Imgproc.fillPoly(mask, maskArea, new Scalar(255, 255, 255));

		// 保存mask圖片
		Imgcodecs.imwrite(filePath,mask);
		log.info("mask圖片:{}生成成功",filePath);

		return mask;
	}

	/**
	 * 根據(jù)mask生成圖片 Mat格式
	 * @param mask
	 * @param strFrom 
	 * @param strTo
	 */
	public static void solve(Mat mask, String strFrom, String strTo){

		int width = mask.width();
		int height = mask.height();

		Mat image = Imgcodecs.imread(strFrom);
		Mat dist = new Mat(new Size(width, height), CvType.CV_8UC3, new Scalar(0, 0, 0));
		image.copyTo(dist,mask);

		Imgcodecs.imwrite(strTo,dist);
		log.info("_ROI圖片:"+strTo+"生成成功");
	}


	public static void main(String[] args) {
		long start = System.currentTimeMillis();

		System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
		String strFrom="C:\\Users\\Administrator\\Desktop\\20220720141206.jpg";//原圖片路徑
		String strTo="C:\\Users\\Administrator\\Desktop\\dest.jpg";//ROI圖片路徑(待生成)
		String maskPath = "C:\\Users\\Administrator\\Desktop\\mask.jpg";//mask的保存路徑(待生成)
		Mat source = Imgcodecs.imread(strFrom);//讀入圖片的mat格式

		//處理邊界點
		List<PointParam> points = new ArrayList<>();
		points.add(new PointParam(50.0, 50.0));
		points.add(new PointParam(700.0, 50.0));
		points.add(new PointParam(700.0, 700.0));
		points.add(new PointParam(50.0, 700.0));

		//=========================1.根據(jù)參數(shù)生成mask============================
		Mat mask = ImageSolveByOpenCV.create(source.width(), source.height(), maskPath, points);//生成的mask
		System.out.println("opencv生成mask花費: " + (System.currentTimeMillis() - start) + "ms");
		start=System.currentTimeMillis();//重置時間

		//=========================2.根據(jù)mask生成ROI效果圖============================
		ImageSolveByOpenCV.solve(mask, strFrom, strTo);
		System.out.println("opencv生成mask花費: " + (System.currentTimeMillis() - start) + "ms");
	}
}

PointParam

@Data
@AllArgsConstructor
public class PointParam {
    Double x;
    Double y;
}

到此這篇關(guān)于Java圖像處理之獲取用戶感興趣的區(qū)域的文章就介紹到這了,更多相關(guān)Java獲取用戶感興趣區(qū)域內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 利用ScriptEngineManager實現(xiàn)字符串公式靈活計算的方法

    利用ScriptEngineManager實現(xiàn)字符串公式靈活計算的方法

    今天小編就為大家分享一篇利用ScriptEngineManager實現(xiàn)字符串公式靈活計算的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • 基于springboot redirect重定向路徑問題總結(jié)

    基于springboot redirect重定向路徑問題總結(jié)

    這篇文章主要介紹了springboot redirect重定向路徑問題總結(jié),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Jenkins自動化部署springboot代碼實例

    Jenkins自動化部署springboot代碼實例

    這篇文章主要介紹了Jenkins自動化部署springboot代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-04-04
  • 使用CORS實現(xiàn)JavaWeb跨域請求問題的方法

    使用CORS實現(xiàn)JavaWeb跨域請求問題的方法

    這篇文章主要介紹了使用Cors實現(xiàn)JavaWeb跨域請求問題的方法,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2016-09-09
  • java 中同步方法和同步代碼塊的區(qū)別詳解

    java 中同步方法和同步代碼塊的區(qū)別詳解

    這篇文章主要介紹了java 中同步方法和同步代碼塊的區(qū)別是什么的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • Java有序的Map LinkedHashMap用法詳解

    Java有序的Map LinkedHashMap用法詳解

    LinkedHashMap是Java提供的一個集合類,它繼承自HashMap,并在HashMap基礎(chǔ)上維護一條雙向鏈表,本文給大家介紹java 有序的Map LinkedHashMap簡介,感興趣的朋友一起看看吧
    2024-01-01
  • 吊打Java面試官之Lambda表達式 Stream API

    吊打Java面試官之Lambda表達式 Stream API

    這篇文章主要介紹了吊打Java之jdk8的新特性包括Lambda表達式、函數(shù)式接口、Stream API全面刨析,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-09-09
  • java 通過聚合查詢實現(xiàn)elasticsearch的group by后的數(shù)量

    java 通過聚合查詢實現(xiàn)elasticsearch的group by后的數(shù)量

    這篇文章主要介紹了java 通過聚合查詢實現(xiàn)elasticsearch的group by后的數(shù)量,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-12-12
  • SpringBoot 版本兼容性問題解決

    SpringBoot 版本兼容性問題解決

    本文詳細介紹了SpringBoot版本兼容性問題的常見場景,包括與SpringFramework、依賴庫、JDK、SpringCloud及插件及工具的兼容性問題,幫助開發(fā)者避免兼容性問題,確保項目的穩(wěn)定性和可維護性
    2024-10-10
  • Java實現(xiàn)DES加解密算法解析

    Java實現(xiàn)DES加解密算法解析

    這篇文章主要介紹了Java實現(xiàn)DES加解密算法解析,結(jié)合完整實例形式分析了DES加密的相關(guān)原理,需要的朋友可以參考下。
    2016-10-10

最新評論

赤水市| 冕宁县| 隆昌县| 曲水县| 房山区| 洛宁县| 敦化市| 九台市| 武胜县| 通化县| 广东省| 东乌珠穆沁旗| 天水市| 潍坊市| 新乐市| 和林格尔县| 榆树市| 陕西省| 琼结县| 东源县| 潼南县| 株洲县| 四平市| 萨迦县| 昔阳县| 辛集市| 报价| 惠东县| 大庆市| 郧西县| 河池市| 凌海市| 六枝特区| 蒙山县| 沛县| 花莲市| 尉犁县| 苏州市| 龙江县| 焦作市| 江城|