<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
獲取ROI圖片:現在有一張圖片,使用者能夠在座標上選擇一些點組成一個區域,這個區域稱為使用者感興趣的區域,需要利用mask掩膜生成,需要生成mask圖片、ROI圖片,要求使用OpenCV+Java實現。
ROI: region of interest 感興趣的區域
OpenCV(Open Source Computer Vision Library)是一個開源的計算機視覺庫,它提供了很多函數,這些函數非常高效地實現了計算機視覺演演算法。
什麼是影象處理中的mask(遮罩),OpenCV中是如此定義Mask的:八位單通道的Mat物件,每個畫素點值為零或者非零區域。當Mask物件新增到影象區上時,只有非零的區域是可見,Mask中所有畫素值為零與影象重疊的區域就會不可見,也就是說Mask區域的形狀與大小直接決定了你看到最終影象的大小與形狀。
可以看出,mask的作用是可以幫助我們提取各種不規則的區域。
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:根據原圖片生成mask,再根據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的區域邊界點 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)); // 構建掩膜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); //根據mask將原圖片img複製生成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:根據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 建立一張mask,根據mask生成ROI圖片 */ @Slf4j public class ImageSolveByOpenCV { static { System.loadLibrary(Core.NATIVE_LIBRARY_NAME); } /** * 建立一個掩膜 * @param width: 圖片的寬度 * @param height: 圖片的高度 * @param filePath: 檔案儲存的路徑 * @param points: 輪廓的頂點 * @return mask圖片的mat格式 */ public static Mat create(int width, int height, String filePath, List<PointParam> points) { // 對輸入的點進行預處理 List<org.opencv.core.Point> list = new ArrayList<>(); for (PointParam p : points) { list.add(new org.opencv.core.Point(p.getX(), p.getY())); } // 建立掩膜區域 List<MatOfPoint> maskArea = new ArrayList<>(); MatOfPoint maskPoints = new MatOfPoint(); maskPoints.fromList(list); maskArea.add(maskPoints); // 構建掩膜 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; } /** * 根據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.根據引數生成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.根據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; }
到此這篇關於Java影象處理之獲取使用者感興趣的區域的文章就介紹到這了,更多相關Java獲取使用者感興趣區域內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45