图像矫正------外端点检测

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_39672386/article/details/77869894

最近学到图像轮廓矫正,有时我们得到的图片并不像我们  想要的那般规整,因此需要我们就需要对图像进行一些调整,以便后续的图像处理,这也是此工作的意义所在。  做一点总结,便于日后的学习。有错误的地方还望各位大神指正。

方法:java调用OpenCV库函数

关键代码如下:

Imgproc.findContours(preImg, contours, new Mat(), Imgproc.RETR_TREE, Imgproc.CHAIN_APPROX_SIMPLE);//画出轮廓

经过一些筛选处理会得到如下图像:

由上图可知图像的四个角点在上面图的交点中,那么问题就变成从这些交点中选取四个端点的问题。

算法主要思想就是想选取据图像中心点距离最小的四个点。具体代码如下:

private static Map<Integer, Integer> getCorners(Mat srcImage, 
Vector<Point> vec) {
double first = 0;
double two = 0;
double three = 0;
double four = 0;
int srcWidth = srcImage.width();
int srcHeight = srcImage.height();
double centerx = srcWidth / 2;
double centery = srcHeight / 2;
int x0 = 0;
int y0 = 0;
int x1 = 0;
int y1 = 0;
int x2 = 0;
int y2 = 0;
int x3 = 0;
int y3 = 0;
for (int i = 0; i < vec.size(); i++) {
int x = (new Double(vec.get(i).x)).intValue();
int y = (new Double(vec.get(i).y)).intValue();
double first1 = x * x + y * y;
double two1 = (srcImage.width() - x) * (srcImage.width() - x) + y
* y;
double three1 = x * x + (srcImage.height() - y)
* (srcImage.height() - y);
double four1 = (srcImage.width() - x) * (srcImage.width() - x)
+ (srcImage.height() - y) * (srcImage.height() - y);

//在图像分为四个区域,每个区域中选取距离最小的点,避免同一区域内有两个点比其他区域的小
if (first < first1 && x < centerx && y < centery) {
first = first1;
x0 = x;
y0 = y;
}
if (two < two1 && x > centerx && x < srcWidth && y < centery) {
two = two1;
x1 = x;
y1 = y;
}
if (three < three1 && x < centerx && y > centery && y < srcHeight) {
three = three1;
x2 = x;
y2 = y;
}
if (four < four1 && x > centerx && x < srcWidth && y > centery
&& y < srcHeight) {
four = four1;
x3 = x;
y3 = y;
}


}

System.out.println("x0=" + x0 + ",y0=" + y0);
System.out.println("x1=" + x1 + ",y1=" + y1);
System.out.println("x2=" + x2 + ",y2=" + y2);
System.out.println("x3=" + x3 + ",y3=" + y3);


Map<Integer, Integer> objCorners = new HashMap<Integer, Integer>();
// x0 x1
// x2 x3
objCorners.put(1, x0);// x0
objCorners.put(2, y0);// y0
objCorners.put(3, x1);// x1
objCorners.put(4, y1);// y1
objCorners.put(5, x2);// x2
objCorners.put(6, y2);// y2
objCorners.put(7, x3);// x3
objCorners.put(8, y3);// y3
return objCorners;
}

然后:将得到的objCorners带入矫正函数中即可。得到最终结果为如下图所示。




猜你喜欢

转载自blog.csdn.net/weixin_39672386/article/details/77869894