需求背景获取roi图片:现在有一张图片,用户能够在坐标上选择一些点组成一个区域,这个区域称为用户感兴趣的区域,需要利用mask掩膜生成,需要生成mask图片、roi图片,要求使用opencv+java实现。
概念解释roiroi: region of interest 感兴趣的区域
opencvopencv(open source computer vision library)是一个开源的计算机视觉库,它提供了很多函数,这些函数非常高效地实现了计算机视觉算法。
掩膜mask什么是图像处理中的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:生成maskpublic 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图片 */@slf4jpublic 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@allargsconstructorpublic class pointparam {    double x;    double y;}
以上就是java图像处理之获取用户感兴趣的区域怎么实现的详细内容。
   
 
   