Go调用opencv实现图片矫正的代码示例

 更新时间:2023年09月04日 09:59:42   作者:冒泡的肥皂  
这篇文章主要为大家详细介绍了Go调用opencv实现图片矫正的代码示例,文中的示例代码简洁易懂,感兴趣的小伙伴可以跟随小编一起学习一下

图片矫正实现流程

1.获取角度

HoughLines获取角度

HoughLines 返回的是角度,画线坐标点需要计算。[0]像素单位距离 [1]角度;注意问题得到线条有干扰需要控制
HoughLinesPWithParams 返回的是坐标点直接画线

FindContours获取角度

FindContours 得到最大面积轮廓-》得到角度

2.旋转图片

temp2D := gocv.GetRotationMatrix2D(rect.Center, angle, 0.8)
gocv.WarpAffine(reactImg, &desc, temp2D, image.Pt(0, reactImg.Cols()/2))

代码

windowA := gocv.NewWindow("watch")
	defer windowA.Close()
	root := getCurrentAbPathByCaller()
	img1 := gocv.IMRead(root+string(os.PathSeparator)+"tp.jfif", gocv.IMReadColor)
	img2 := gocv.NewMat()
	gocv.Canny(img1, &img2, 80, 160)
	//img3, _ := img2.ToImage()
	/*
			RetrievalExternal 最外侧轮廓
		    RETR_LIST:返回所有轮廓线,不建立等级关系
			RETR_CCOMP :返回所有轮廓,包含两个层级结构
			RETR_TREE :返回所有轮廓,建立完整的层次结构
	*/
	pointVecotr := gocv.FindContours(img2, gocv.RetrievalExternal, gocv.ChainApproxNone)
	gocv.DrawContours(&img1, pointVecotr, -1, color.RGBA{255, 0, 0, 0}, 1)
	maxindex := getMaxArea(pointVecotr)
	react := gocv.BoundingRect(pointVecotr.At(maxindex))
	reactImg := img1.Region(react)
	rect := gocv.MinAreaRect(pointVecotr.At(maxindex))
	points := rect.Points
	for i := 0; i < len(points); i++ {
		fmt.Println("%d %d", points[i].X, points[i].Y)
	}
	//
	line1 := math.Sqrt(math.Pow(float64(points[1].Y-points[0].Y), 2) + math.Pow(float64(points[1].X-points[0].X), 2))
	line2 := math.Sqrt(math.Pow(float64(points[3].Y-points[0].Y), 2) + math.Pow(float64(points[3].X-points[0].X), 2))
	//角度
	var angle = rect.Angle
	if line1 > line2 {
		angle = 90 + angle
	}
	desc := gocv.NewMat()
	/*
	GetAffineTransform 原图像点-》转换后图像点
	*/
	temp2D := gocv.GetRotationMatrix2D(rect.Center, angle, 0.8)
	gocv.WarpAffine(reactImg, &desc, temp2D, image.Pt(0, reactImg.Cols()/2))
	//reactImg := img1.Region(react)
	//gocv.BoxPoints(gocv.MinAreaRect(pointVecotr.At(getMaxArea(pointVecotr))), &img2)
	windowA.IMShow(desc)
	windowA.WaitKey(0)

到此这篇关于Go调用opencv实现图片矫正的代码示例的文章就介绍到这了,更多相关Go opencv图片矫正内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 基于Golang 高并发问题的解决方案

    基于Golang 高并发问题的解决方案

    这篇文章主要介绍了Golang 高并发问题的解决方案,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-05-05
  • Golang的命名规范及最佳实践(推荐!)

    Golang的命名规范及最佳实践(推荐!)

    这篇文章主要给大家介绍了关于Golang的命名规范及最佳实践的相关资料,命名规则涉及变量、常量、全局函数、结构、接口、方法等的命名,文中介绍的非常详细,需要的朋友可以参考下
    2023-10-10
  • Golang 中的 条件变量(sync.Cond)详解

    Golang 中的 条件变量(sync.Cond)详解

    这篇文章主要介绍了Golang 中的 条件变量(sync.Cond)详解的相关资料,需要的朋友可以参考下
    2022-12-12
  • Gin使用swagger生成接口文档的代码示例

    Gin使用swagger生成接口文档的代码示例

    Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful Web 服务,它使用 YAML 或 JSON 格式来定义 API 的结构,本文给大家介绍了Gin使用swagger生成接口文档的代码示例,需要的朋友可以参考下
    2024-06-06
  • go语言题解LeetCode506相对名次示例详解

    go语言题解LeetCode506相对名次示例详解

    这篇文章主要为大家介绍了go语言题解LeetCode506相对名次示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • golang避免内存溢出的方法

    golang避免内存溢出的方法

    内存溢出(Memory Overflow)是指程序在运行时超出了分配给它的内存限制,从而导致程序异常或崩溃的现象,内存溢出的问题在任何编程语言中都可能出现,Go 语言也不例外,本文给大家介绍了golang是如何解决内存溢出的,需要的朋友可以参考下
    2024-09-09
  • Golang 定时器的终止与重置实现

    Golang 定时器的终止与重置实现

    在实际开发过程中,我们有时候需要编写一些定时任务。很多人都熟悉定时器的使用,那么定时器应该如何终止与重置,下面我们就一起来了解一下
    2021-08-08
  • 详解Gotorch多机定时任务管理系统

    详解Gotorch多机定时任务管理系统

    遵循着“学一门语言最好的方式是使用它”的理念,想着用Go来实现些什么,刚好有一个比较让我烦恼的问题,于是用Go解决一下,即使不在生产环境使用,也可以作为Go语言学习的一种方式。
    2021-05-05
  • golang 常用定时任务汇总

    golang 常用定时任务汇总

    这篇文章主要介绍了golang 常用定时任务汇总,golang利用goroutine外加github.com/gorhill/cronexpr库就可实现定时任务,具体代码介绍,需要的小伙伴可以参考一下
    2022-09-09
  • Go类型安全的HTTP请求示例详解

    Go类型安全的HTTP请求示例详解

    这篇文章主要为大家介绍了Go类型安全的HTTP请求示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06

最新评论