今天主要学习了基于 OpenCV 库的图像处理基础操作,具体包括以下几个方面:
图像创建:
-
创建黑色图像(使用 np.zeros())
black = np.zeros((640,480,3),dtype=np.uint8) cv.imshow("black",black) -
创建白色图像(使用 np.full())
white = np.full((640,480,3),255,dtype=np.uint8) cv.imshow("white",white) -
生成随机像素值的图像(使用 np.random.randint())
random = np.random.randint(0,255,(640,480,3),dtype=np.uint8) cv.imshow("random",random) -
修改图像像素值的方法
black[:,:,:] = 255 cv.imshow("white2",black)
图像绘制:
-
在图像上绘制直线(cv.line())
cv.line(cat,(123,674),(280,470),(0,0,255),5) -
绘制矩形(cv.rectangle())
cv.rectangle(cat,(240,374),(380,470),(123,155,0),-1) -
绘制圆形(cv.circle()),包括抗锯齿技术的应用
cv.circle(cat,(320,420),50,(0,255,0),-1,cv.LINE_AA)
图像基础操作:
-
创建不同类型的显示窗口(cv.namedWindow())
cv.namedWindow("win1",cv.WINDOW_AUTOSIZE) cv.namedWindow("win2",cv.WINDOW_NORMAL) -
读取彩色和灰度图像(cv.imread())
img=cv.imread("../images/1.jpg") gray=cv.imread("../images/1.jpg",cv.IMREAD_GRAYSCALE) -
保存图像(cv.imwrite())
cv.imwrite("./gray.jpg",gray) -
显示图像及窗口控制(cv.imshow(), cv.waitKey(), cv.destroyAllWindows())
#显示图像 cv.imshow("win1",img) cv.imshow("win2",gray) #留下绘制时间 等待n毫秒 0表示一直等待 cv.waitKey(0) #销毁窗口释放资源 cv.destroyAllWindows()
图像剪裁与修改:
-
对图像进行区域剪裁(ROI 提取)
roi = cat[240:374,380:477] -
通过修改剪裁区域影响原图像素
roi[:,:] = (0,0,255)
视频处理:
-
读取视频文件和摄像头实时视频流(cv.VideoCapture())
cap = cv.VideoCapture("../images/videocap.mp4") -
循环读取视频帧并显示
while True: ret,frame=cap2.read() -
视频播放控制与退出机制
#判断是否读取成功 if not ret: print("无法读取视频") break cv.imshow("video",frame) if cv.waitKey(1) & 0xFF == ord("q"): print("按键退出") break cap.release() cv.destroyAllWindows()
图像大小调整:
-
使用 cv.resize() 调整图像尺寸
dst= cv.resize(cat,(640,480))
学习心得
原以为图像处理门槛很高,实际用 OpenCV 发现基础操作比预想直观。几个关键发现:
-
ROI 的指针特性
用img[y1:y2, x1:x2]切片提取区域时,修改子图会直接改变原图数据。这种类似指针的操作效率很高,编码时要注意避免误改原图。 -
视频流的本质验证
cv.VideoCapture()+ 循环read()的流程,把 “视频=连续帧” 的理论具象化了。手动控制帧读取时,对视频播放的理解反而比直接调用播放器更清晰。 -
即时反馈驱动学习
最有效的学习动力来自实时可视化:-
画个矩形 → 运行 → 立即看到效果
-
调整参数 → 重新运行 → 对比变化
这种闭环极大降低调试成本,比纯看文档效率高。
-

823

被折叠的 条评论
为什么被折叠?



