网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
for {
frame := capture.QueryFrame()
window.ShowImage(frame)
key := highgui.WaitKey(10)
// 按Esc键退出
if key == 27 {
break
}
}
window.DestroyWindow()
}
在这段代码中,我们创建了一个名为`window`的窗口和一个名为`capture`的摄像头采集对象。然后,我们通过循环不断地采集摄像头数据并显示在窗口中,直到用户按下Esc键退出。
最后,我们在`main`函数中调用`captureCamera`函数来进行摄像头数据的采集:
func main() {
fmt.Println(“Starting camera capture…”)
captureCamera()
fmt.Println(“Camera capture stopped.”)
}
### 运行和测试
完成代码编写后,我们可以使用以下命令来编译和运行代码:
go run main.go
如果一切正常,你会看到一个窗口弹出并展示摄像头采集的数据。按下Esc键即可退出。
### 图像处理
通过上面的代码,我们已经能够实时采集摄像头数据并显示在窗口中了。接下来,我们可以进行一些简单的图像处理。
例如,我们可以将采集到的彩色图像转换成灰度图像:
func captureCamera() {
// …
window := highgui.NewWindow("Camera Window")
capture := highgui.NewCameraCapture(0)
if capture == nil {
panic("Failed to open camera")
}
for {
frame := capture.QueryFrame()
grayFrame := core.NewMat()
core.CvtColor(frame, grayFrame, core.CV_BGR2GRAY)
window.ShowImage(grayFrame)
grayFrame.Release()
// ...
}
// ...
}
在上述代码中,我们使用`core.CvtColor`函数将彩色图像`frame`转换成灰度图像`grayFrame`,然后再显示在窗口中。
我们还可以进行更多复杂的图像处理,比如边缘检测、人脸识别等,这超出了本文的范围。你可以参考`go-opencv`库的文档(https://godoc.org/github.com/hybridgroup/go-opencv)了解更多的图像处理功能。
### 案例
#### 案例一:头部姿态估计
package main
import (
“fmt”
“github.com/hybridgroup/go-opencv/core”
“github.com/hybridgroup/go-opencv/highgui”
“github.com/hybridgroup/go-opencv/imgproc”
)
func main() {
capture, err := highgui.NewCameraCapture(0)
if err != nil {
fmt.Println(“无法打开摄像头”)
return
}
window := highgui.NewWindow("Camera Window")
if window == nil {
panic("无法创建窗口")
}
for {
frame := capture.QueryFrame()
if frame == nil {
break
}
gray := core.NewMat()
imgproc.CvtColor(frame, gray, imgproc.CV_BGR2GRAY)
imgproc.EqualizeHist(gray, gray)
cascade := imgproc.LoadHaarClassifierCascade("haarcascade\_frontalface\_alt.xml")
rectangles := cascade.DetectObjects(gray)
for \_, rect := range rectangles {
faceImg := frame.GetSubRect(rect)
eyesCascade := imgproc.LoadHaarClassifierCascade("haarcascade\_eye.xml")
eyes := eyesCascade.DetectObjects(faceImg)
var leftEye, rightEye core.Rect
for \_, eye := range eyes {
if eye.X()+eye.Height()/2 < faceImg.Width()/2 {
leftEye = eye
} else {
rightEye = eye
}
}
if leftEye != nil && rightEye != nil {
imgproc.Rectangle(frame, rect, core.Scalar{255, 0, 0, 0}, 2, 1, 0)
imgproc.Rectangle(faceImg, leftEye, core.Scalar{0, 255, 0, 0}, 2, 1, 0)
imgproc.Rectangle(faceImg, rightEye, core.Scalar{0, 255, 0, 0}, 2, 1, 0)
}
}
window.ShowImage(frame)
window.WaitKey(1)
}
window.DestroyWindow()
}
这个案例使用了OpenCV中的级联分类器(Cascade Classifier)来检测人脸和眼睛,并通过在图像中绘制矩形来标记它们的位置。使用棕色矩形框标记人脸,绿色矩形框标记眼睛。本案例展示了通过摄像头采集的实时视频流,实时进行头部姿态估计。
#### 案例二:实时人脸识别
package main
import (
“fmt”
“github.com/hybridgroup/go-opencv/core”
“github.com/hybridgroup/go-opencv/highgui”
“github.com/hybridgroup/go-opencv/imgproc”
)
func main() {
capture, err := highgui.NewCameraCapture(0)
if err != nil {
fmt.Println(“无法打开摄像头”)
return
}
window := highgui.NewWindow("Camera Window")
if window == nil {
panic("无法创建窗口")
}
cascade := imgproc.LoadHaarClassifierCascade("haarcascade\_frontalface\_alt.xml")
for {
frame := capture.QueryFrame()
if frame == nil {
break
}
gray := core.NewMat()
imgproc.CvtColor(frame, gray, imgproc.CV_BGR2GRAY)
imgproc.EqualizeHist(gray, gray)
rectangles := cascade.DetectObjects(gray)
for \_, rect := range rectangles {
imgproc.Rectangle(frame, rect, core.Scalar{255, 0, 0, 0}, 2, 1, 0)
}
window.ShowImage(frame)
window.WaitKey(1)
}
window.DestroyWindow()
}
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
tsiMlY-1715832054546)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新