Java圖像處理之獲取用戶感興趣的區(qū)域
需求背景
獲取ROI圖片:現(xiàn)在有一張圖片,用戶能夠在坐標(biāo)上選擇一些點(diǎn)組成一個(gè)區(qū)域,這個(gè)區(qū)域稱為用戶感興趣的區(qū)域,需要利用mask掩膜生成,需要生成mask圖片、ROI圖片,要求使用OpenCV+Java實(shí)現(xiàn)。
概念解釋
ROI
ROI: region of interest 感興趣的區(qū)域
openCV
OpenCV(Open Source Computer Vision Library)是一個(gè)開源的計(jì)算機(jī)視覺庫,它提供了很多函數(shù),這些函數(shù)非常高效地實(shí)現(xiàn)了計(jì)算機(jī)視覺算法。
掩膜mask
什么是圖像處理中的mask(遮罩),OpenCV中是如此定義Mask的:八位單通道的Mat對(duì)象,每個(gè)像素點(diǎn)值為零或者非零區(qū)域。當(dāng)Mask對(duì)象添加到圖像區(qū)上時(shí),只有非零的區(qū)域是可見,Mask中所有像素值為零與圖像重疊的區(qū)域就會(huì)不可見,也就是說Mask區(qū)域的形狀與大小直接決定了你看到最終圖像的大小與形狀。

可以看出,mask的作用是可以幫助我們提取各種不規(guī)則的區(qū)域。
代碼實(shí)現(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ū)域邊界點(diǎn)
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)建一個(gè)掩膜
* @param width: 圖片的寬度
* @param height: 圖片的高度
* @param filePath: 文件保存的路徑
* @param points: 輪廓的頂點(diǎn)
* @return mask圖片的mat格式
*/
public static Mat create(int width, int height, String filePath, List<PointParam> points) {
// 對(duì)輸入的點(diǎn)進(jìn)行預(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格式
//處理邊界點(diǎn)
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花費(fèi): " + (System.currentTimeMillis() - start) + "ms");
start=System.currentTimeMillis();//重置時(shí)間
//=========================2.根據(jù)mask生成ROI效果圖============================
ImageSolveByOpenCV.solve(mask, strFrom, strTo);
System.out.println("opencv生成mask花費(fèi): " + (System.currentTimeMillis() - start) + "ms");
}
}PointParam
@Data
@AllArgsConstructor
public class PointParam {
Double x;
Double y;
}到此這篇關(guān)于Java圖像處理之獲取用戶感興趣的區(qū)域的文章就介紹到這了,更多相關(guān)Java獲取用戶感興趣區(qū)域內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
利用ScriptEngineManager實(shí)現(xiàn)字符串公式靈活計(jì)算的方法
今天小編就為大家分享一篇利用ScriptEngineManager實(shí)現(xiàn)字符串公式靈活計(jì)算的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-07-07
基于springboot redirect重定向路徑問題總結(jié)
這篇文章主要介紹了springboot redirect重定向路徑問題總結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09
Jenkins自動(dòng)化部署springboot代碼實(shí)例
這篇文章主要介紹了Jenkins自動(dòng)化部署springboot代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04
使用CORS實(shí)現(xiàn)JavaWeb跨域請(qǐng)求問題的方法
這篇文章主要介紹了使用Cors實(shí)現(xiàn)JavaWeb跨域請(qǐng)求問題的方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-09-09
吊打Java面試官之Lambda表達(dá)式 Stream API
這篇文章主要介紹了吊打Java之jdk8的新特性包括Lambda表達(dá)式、函數(shù)式接口、Stream API全面刨析,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-09-09
java 通過聚合查詢實(shí)現(xiàn)elasticsearch的group by后的數(shù)量
這篇文章主要介紹了java 通過聚合查詢實(shí)現(xiàn)elasticsearch的group by后的數(shù)量,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-12-12

