go调用opencv连通域标记ConnectedComponents

go中调用opencv底层是c的api报错很蛋疼,对于用惯了java的精确报错很不适应

在说连通性api前先介绍下Mat的类型

lua 复制代码
MatTypeCV8U/MatTypeCV8S
MatTypeCV16U/MatTypeCV16S/MatTypeCV16C2

S|U|F
S--代表---signed int------有符号整形
U--代表--unsigned int-----无符号整形
F--代表--float----------------单精度浮点型
 
C<number_of_channels>----------代表一张图片的通道数,比如:
1--灰度图片--grayImg------------是单通道图像
2--RGB彩色图像------------------是3通道图像
3--带Alph通道的RGB图像------是4通道图像

8/16/32位数
CV_8U - 8位无符号整数(0...255)
CV_8S - 8位有符号整数(-128...127)
CV_16U - 16位无符号整数(0...65535)
CV_16S - 16位有符号整数(-32768...32767)
CV_32S - 32位有符号整数(-2147483648...2147483647)
CV_32F - 32位浮点数(-FLT_MAX...FLT_MAX,INF,NAN)
CV_64F - 64位浮点数(-DBL_MAX...DBL_MAX,INF,NAN)

颜色设置(可能是错的)

go 复制代码
mat := NewMatWithSize(101, 102, MatTypeCV8U)
mat.SetUCharAt(50, 50, 25)
mat.SetUCharAt3(50, 50, 0, 25)

mat := NewMatWithSize(101, 102, MatTypeCV16S)
mat.SetShortAt(50, 50, 25)
mat.SetShortAt3(50, 50, 0, 25)

mat := NewMatWithSize(101, 102, MatTypeCV32S)
mat.SetIntAt(50, 50, 25)
mat.SetIntAt3(50, 50, 0, 25)

F为float

C3类型的没看懂

类型转换函数

go 复制代码
src := gocv.IMRead(root+string(os.PathSeparator)+"1.jpg", gocv.IMReadColor)
defer src.Close()
src.ConvertTo(&src, gocv.MatTypeCV8UC3)

连通域标记

代码可能会有问题因为go的opencv网上找不到资料,只有参考一些test和其他语言的一些东西

go 复制代码
i1 := gocv.NewMatWithSize(src.Rows(), src.Cols(), src.Type())
defer i1.Close()
count := gocv.ConnectedComponents(imgThresh, &i1)//连通域标记

fmt.Println("----%d,%d,%d", count, src.Type(), imgThresh.Type(), i1.Type())
img4 := gocv.Zeros(src.Rows(), src.Cols(), src.Type())//注意类型
defer img4.Close()
/*
		src是输入图像,必须是 8位三通道的图像8UC3。
		    在对图像使用 cv2.watershed()函数处理之前,必须先用正数大致勾画出图像中的期望分割区域。
			每一个分割的区域会被标注为1、2、3等。对于尚未确定的区域,需要将它们标注为0。我们可以将标注区域理解为进行分水岭算法分割的"种子"区域。
		markers 是32 位单通道的标注结果,它应该和 image具有相等大小。
		       在markers 中,每一个像素要么被设置为初期的" 种子值 ",要么被设置为" -1 " 表示边界。markers 可以省略。
	*/        
// gocv.Watershed(src, &markers)

//随机颜色
rand.Seed(time.Now().UnixNano()) // 纳秒时间戳
var color []int32
for i := 0; i < count; i++ {
 ii := rand.Intn(255)
 color = append(color, int32(ii))
}

fmt.Println("===%d=%d", src.Rows(), src.Cols())
fmt.Println("===%d=%d", img4.Rows(), img4.Cols())
//设置颜色 还不太会
for i := 0; i < src.Rows(); i++ {
  for j := 0; j < src.Cols(); j++ {
                 index := i1.GetIntAt(i, j)
		     if index == -1 {
				img4.SetIntAt3(i, j, 0, 255)
			} else if index <= 0 || index > int32(count) {
				fmt.Println("==%d", index)
				img4.SetIntAt3(i, j, 0, 0)
			} else {
				fmt.Println("==%d", index)
				img4.SetIntAt3(i, j, 0, color[index])
			}
		}
	}
	windowA.IMShow(img4)
	windowA.WaitKey(0)
相关推荐
炒空心菜菜2 小时前
SparkSQL 连接 MySQL 并添加新数据:实战指南
大数据·开发语言·数据库·后端·mysql·spark
白熊1883 小时前
【计算机视觉】OpenCV实战项目:基于Tesseract与OpenCV的字符识别系统深度解析
人工智能·opencv·计算机视觉
蜗牛沐雨4 小时前
Rust 中的 `PartialEq` 和 `Eq`:深入解析与应用
开发语言·后端·rust
Python私教4 小时前
Rust快速入门:从零到实战指南
开发语言·后端·rust
Ronin-Lotus4 小时前
图像处理篇---MJPEG视频流处理
图像处理·python·opencv
秋野酱5 小时前
基于javaweb的SpringBoot爱游旅行平台设计和实现(源码+文档+部署讲解)
java·spring boot·后端
小明.杨5 小时前
Django 中时区的理解
后端·python·django
有梦想的攻城狮5 小时前
spring中的@Async注解详解
java·后端·spring·异步·async注解
六bring个六5 小时前
qtcreater配置opencv
c++·qt·opencv·计算机视觉·图形渲染·opengl
qq_12498707535 小时前
原生小程序+springboot+vue医院医患纠纷管理系统的设计与开发(程序+论文+讲解+安装+售后)
java·数据库·spring boot·后端·小程序·毕业设计