OpenCVJava为轮廓创建边界框和圆package com.opencv;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import Core;
import Core.MinMaxLocResult;
import CvType;
import Mat;
import MatOfInt;
import MatOfPoint;
import MatOfPoint2f;
import Point;
import Rect;
import Scalar;
import Size;
import org.opencv.highgui.HighGui;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
public class OpenCvMain {
//静态代码块加载动态链接库
static{
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
}rectangle函数opencv
public static void main(String[] args){
/*
* IMREAD_UNCHANGED = -1 :不进⾏转化,⽐如保存为了16位的图⽚,读取出来仍然为16位。
* IMREAD_GRAYSCALE = 0 :进⾏转化为灰度图,⽐如保存为了16位的图⽚,读取出来为8位,类型为CV_8UC1。 * IMREAD_COLOR = 1 :进⾏转化为三通道图像。
* IMREAD_ANYDEPTH = 2 :如果图像深度为16位则读出为16位,32位则读出为32位,其余的转化为8位。
* IMREAD_ANYCOLOR = 4 :图像以任何可能的颜⾊格式读取
* IMREAD_LOAD_GDAL = 8 :使⽤GDAL驱动读取⽂件,GDAL(Geospatial Data Abstraction
* Library)是⼀个在X/MIT许可协议下的开源栅格空间数据转换库。它利⽤抽象数据模型来表达所⽀持的各种⽂件格式。 * 它还有⼀系列命令⾏⼯具来进⾏数据转换和处理。
*/
Mat src = Imgcodecs.imread("D:\\123.jpg");//待匹配图⽚
Mat dst =new Mat();
//将图像从⼀种颜⾊空间转换为另⼀种颜⾊空间 blog.csdn/ren365880/article/details/103869207
Imgproc.cvtColor(src, dst, Imgproc.COLOR_BGR2GRAY);
//均值模糊 blog.csdn/ren365880/article/details/103878059
Imgproc.blur( dst, dst,new Size(3,3));
HighGui.imshow("原图", src);
HighGui.waitKey();
/* 将固定级别的阈值应⽤于每个数组元素。
* blog.csdn/ren365880/article/details/103927636
*/
Imgproc.threshold(dst, dst,200,255, Imgproc.THRESH_BINARY);
/*
* 查⼆进制图像中的轮廓
* blog.csdn/ren365880/article/details/103970023
*/
List<MatOfPoint> list =new ArrayList<MatOfPoint>();
Mat hierarchy =new Mat();
Imgproc.findContours(dst, list, hierarchy, Imgproc.RETR_TREE, Imgproc.CHAIN_APPROX_SIMPLE,new Point(0,0)); List<MatOfPoint> approxCurveList =new ArrayList<MatOfPoint>();
List<MatOfPoint> approxCurveList =new ArrayList<MatOfPoint>();
List<Rect> rectList =new ArrayList<Rect>();
List<Point> centerList =new ArrayList<Point>();
List<Integer> radiusList =new ArrayList<Integer>();
for(int i=0,size = list.size();i<size;i++){
MatOfPoint2f approxCurve =new MatOfPoint2f();
Point center =new Point();
float[] radius =new float[10];
/*
* 以指定的精度最⼤化接近多边形曲线。
* 函数cv :: approxPolyDP⽤⼀条具有较少顶点的曲线或多边形最⼤化接近⼀条曲线或多边形,以使它们之间的距离⼩于或等于指定的精度。 * 它使⽤Douglas-Peucker算法</wiki/Ramer-Douglas-Peucker_algorithm>
* @param curve存储在std :: vector或Mat中的2D点的输⼊向量
* @param roxCurve近似结果。类型应与输⼊曲线的类型匹配。
* @param epsilon指定近似精度的参数。这是原始曲线与其近似值之间的最⼤距离。
* @param 闭合如果为true,则近似曲线将闭合(其第⼀个和最后⼀个顶点已连接)。否则,它不会关闭。
*/
Imgproc.approxPolyDP(new (i).toArray()), approxCurve,3,true);
approxCurveList.add(new Array()));
/*
* 计算点集或灰度图像的⾮零像素的右边界矩形。该函数为指定的点集或灰度图像的⾮零像素计算并返回最⼩的垂直边界矩形。
* @param数组输⼊存储在std :: vector或Mat中的灰度图像或2D点集。
*/
Rect boundRect = Imgproc.boundingRect(approxCurve);
rectList.add(boundRect);
/*
* 查包含2D点集的最⼩⾯积的圆。该函数使⽤迭代算法到2D点集的最⼩封闭圆。
* @param points 2D点的输⼊向量,存储在std :: vector <>或Mat中
* @param center输出圆的中⼼。
* @param radius输出圆的半径。
*/
Imgproc.minEnclosingCircle(approxCurve, center, radius);
centerList.add(center);
radiusList.add((int)radius[0]);
}
for(int i=0,size = list.size();i<size;i++){
Scalar color =new Scalar(0,220,0);
Scalar color2 =new Scalar(0,0,220);
//blog.csdn/ren365880/article/details/103970023
Imgproc.drawContours(src, approxCurveList, i, color,1, Imgproc.LINE_AA,new Mat(),0,new Point());
/*
* 绘制⼀个简单的,粗的或实⼼的直⾓矩形。函数cv :: rectangle绘制⼀个矩形轮廓或⼀个填充的矩形,其两个相对⾓为pt1和pt2。
* @param img图⽚。
* @param pt1矩形的顶点。
* @param pt2与pt1相反的矩形的顶点。
* @param color矩形的颜⾊或亮度(灰度图像)。
* @param thickness组成矩形的线的粗细。负值(如#FILLED)表⽰该函数必须绘制⼀个填充的矩形。
* @param lineType线的类型。请参阅blog.csdn/ren365880/article/details/103952856
* @param shift点坐标中的⼩数位数。
*/
/*
* 画⼀个圆。函数cv :: circle绘制具有给定中⼼和半径的简单或实⼼圆。
* @param img绘制圆的图像。
* @param center圆⼼。
* @param radius圆的半径。
* @param color圆形颜⾊。
* @param thickness圆轮廓的宽度(如果为正)。负值(如#FILLED)表⽰要绘制⼀个实⼼圆。
* @param lineType圆边界的类型。请参阅blog.csdn/ren365880/article/details/103952856
* @param shift中⼼坐标和半径值中的⼩数位数。
*/
Imgproc.circle( src, (i), (i), color2,2, Imgproc.LINE_AA,0);
}
HighGui.imshow("边界框和圆", src); HighGui.waitKey();
}
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论