文章目录
- 一、实验目的
- 二、实验内容
- 三、实验过程
- OpenCV-python的安装与配置
- python下载和环境配置
- PIP镜像
- 安装Numpy
- 安装openCV-python
- 检验opencv安装是否成功
- openCV-python的基本操作
- 图像输入和展示以及写出
- openCV界面编程
- 单窗口显示多图片
- 鼠标事件
- 键盘事件
- 滑动条事件
- 四、实验结果
- 五、实验总结
一、实验目的
本实验目的是学习如何使用opencv库来读取文件并显示图象,学习opencv中的基本事件——窗口事件,鼠标事件、键盘事件以及滑动条事件,同时熟悉OpenCV库的函数和方法,为进一步学习和应用计算机视觉和图像处理提供基础。
二、实验内容
1、opencv的安装
2、opencv的基本操作 - 图像输入输出模块:通过cv2.imread()函数读取图像文件,并使用cv2.imshow()函数显示图像。使用cv2.waitKey()等待按键响应,然后使用cv2.destroyAllWindows()关闭窗口。使用shape属性获取图像的形状(高度、宽度)。使用cv2.imwrite()函数将图像保存到指定的文件中。 - opencv界面编程:界面编程主要由High-level GUI模块支持。 - 单窗口显示多图片:使用hstack函数实现单窗口显示多幅图像。 - 销毁窗口:使用destroyWindow和destroyAllWindows来销毁窗口,前者为销毁某一个制定名称的窗口,后者为销毁所有的窗口。 - 鼠标事件:我们使用鼠标事件来实现与用户的交互操作,有鼠标点击事件、鼠标移动事件、鼠标释放事件等。 - 键盘事件:键盘事件由waitKey函数实现。 - 滑动条事件:使用cv2.createTrackbar()函数创建一个滑动条,并指定滑动条的名称、所属窗口、数值范围和初始值等参数。定义一个滑动条事件的回调函数,并将其与窗口绑定。在滑动条事件回调函数中,根据滑动条的数值变化对图像进行实时更新和显示。
三、实验过程
OpenCV-python的安装与配置
python下载和环境配置
1.前往python官网进行对应版本的下载
2.下载完成打开程序进行配置,点击Install Now 也可以进行安装目录的更改
3.检测安装成果,打开命令行窗口,输入pyhthon
如果显示如下图就安装配置成功
PIP镜像
再命令行窗口分别运行以下两行代码,如下图
第一行是更新pip
第二行是把pip对应的国外网站改为镜像国内的,提高下载速度 python -m pip install --upgrade pip pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
安装Numpy
打开命令行输入 pip install numpy
来下载Numpy包,如图(不更改pip镜像会很慢)
安装openCV-python
命令行运行 pip install opencv-python
如图
再安装一下openCV的扩展包,后面接版本号,和我们安装openCV版本一致即可 pip install opencv-contrib-python4.8.0.76
再安装一个可视化库 pip install matplotlib
检验opencv安装是否成功
命令行先输入python
然后导入一下包 import cv2
再检查一下版本 cv2.version
如果能正常显示版本就是安装成功,然后exit()退出即可
openCV-python的基本操作
图像输入和展示以及写出
# 读取图像文件
src_image = cv2.imread('bird.jpg', cv2.IMREAD_COLOR)
gray_image = cv2.imread('bird.jpg', cv2.IMREAD_GRAYSCALE)
cv2.imshow("src_image", src_image)
print(src_image.shape)
cv2.waitKey(0)
# 写入图像文件
cv2.imwrite('gray_image.jpg', gray_image)
效果展示
图像写入和展示
灰度图像的写入
openCV界面编程
OpenCV界面编程
img = cv2.imread('image.jpg')
cv2.imshow("mying", img)
cv2.waitKey(0)
效果展示
对应图片会出现在以mying命名的窗口中
单窗口显示多图片
# 单窗口显示多图片
def opencv_muti_pic():
img1 = cv2.imread('1.jpg')
print(img1.shape)
img2 = cv2.imread('1.jpg')
print(img2.shape)
img3 = cv2.imread('1.jpg')
print(img3.shape)
imgs = np.hstack([img1, img2, img3])
# 展示多个
cv2.imshow('mutil_pic', imgs)
# 等待关闭
cv2.waitKey(0)
opencv_muti_pic()
效果展示
鼠标事件
鼠标事件 # 回调函数,用于处理鼠标事件
def mouse_callback(event, x, y, flags, param):
if event == cv2.EVENT_MOUSEMOVE: # 鼠标移动事件
print('Mouse moved at (%d, %d)' % (x, y))
elif event == cv2.EVENT_LBUTTONDOWN: # 鼠标左键按下事件
print('Left button down at (%d, %d)' % (x, y))
elif event == cv2.EVENT_RBUTTONDOWN: # 鼠标右键按下事件
print('Right button down at (%d, %d)' % (x, y))
elif event == cv2.EVENT_MBUTTONDOWN: # 鼠标中键按下事件
print('Middle button down at (%d, %d)' % (x, y))
elif event == cv2.EVENT_LBUTTONUP: # 鼠标左键释放事件
print('Left button up at (%d, %d)' % (x, y))
elif event == cv2.EVENT_RBUTTONUP: # 鼠标右键释放事件
print('Right button up at (%d, %d)' % (x, y))
elif event == cv2.EVENT_MBUTTONUP: # 鼠标中键释放事件
print('Middle button up at (%d, %d)' % (x, y))
elif event == cv2.EVENT_LBUTTONDBLCLK: # 鼠标左键双击事件
print('Left button double-clicked at (%d, %d)' % (x, y))
elif event == cv2.EVENT_RBUTTONDBLCLK: # 鼠标右键双击事件
print('Right button double-clicked at (%d, %d)' % (x, y))
elif event == cv2.EVENT_MBUTTONDBLCLK: # 鼠标中键双击事件
print('Middle button double-clicked at (%d, %d)' % (x, y))
# 创建一个名为 "image" 的窗口
cv2.namedWindow('image')
# 读取图像
img = cv2.imread('image.jpg')
# 在窗口中显示图像
cv2.imshow('image', src_image)
# 设置鼠标回调函数
cv2.setMouseCallback('image', mouse_callback)
cv2.waitKey(0)
# 关闭窗口
cv2.destroyAllWindows()
效果展示
对应输出结果会随鼠标指针在图像上的位置而变化
键盘事件
# 键盘事件
img7 = numpy.zeros((100, 200))
cv2.imshow("windowname", img7
key1 = cv2.waitKey(0) # 任意按键按下,图片显示结束,返回按键键值
print("按下的键值:", key1)
cv2.imshow("windowname2", img7)
key2 = cv2.waitKey(5000) # 任意按键按下,图片显示结束,返回按键键值
print("按下的键值:", key2)
cv2.destroyAllWindows()
效果展示
键盘事件
输入q的情况,会返回对应的q的ASCII码值
第二个窗口长期不按会显示-1的返回结果
滑动条事件
滑动条事件
# 回调函数,用于处理滑动条变化事件
def TrackbarCallback(value):
print('Trackbar value is: %d' % value)
# 创建一个名为 "image" 的窗口
cv2.namedWindow('image')
# 读取图像
img = cv2.imread('image.jpg')
# 在窗口中显示图像
cv2.imshow('image', img)
# 创建一个名为 "slider" 的滑动条
cv2.createTrackbar('slider', 'image', 0, 100, TrackbarCallback)
# 获取滑动条的当前值
slider_value = cv2.getTrackbarPos('slider', 'image')
print('Initial slider value: %d' % slider_value)
# 设置滑动条的值
cv2.setTrackbarPos('slider', 'image', 50)
# 循环等待键盘输入
while True:
key = cv2.waitKey(10)
if key == ord('q'):
break
# 关闭窗口
cv2.destroyAllWindows()
效果展示
通过鼠标滑动图片上方的滑动条可以再控制台动态的输出滑动条信息
四、实验结果
实验结果已经在实验过程中写出,实验结果的所有截图均可在实验过程中查看,这里不做过多展示
五、实验总结
通过本次实验,我对以下知识有了更好的掌握:文件读取和图像显示:学习如何使用OpenCV库来读取图像文件并在窗口中显示图像,这是图像处理的基础操作。窗口事件:了解如何处理窗口事件,比如窗口的关闭事件,以确保图像显示过程中的交互性和稳定性。鼠标事件:学习如何捕获和处理鼠标事件,比如点击、移动和拖拽等,为图像标记、交互式测量等功能的实现奠定基础。键盘事件:掌握如何处理键盘事件,比如按键响应和组合操作,为实现键盘控制的图像处理流程打下基础。滑动条事件:了解如何创建和使用滑动条,实现图像处理参数的实时调整和交互式控制。为进一步学习和应用计算机视觉和图像处理奠定基础。