单独使用OpenCV的时候遇到了之前因为安装 ROS 而导致的一些坑点。

故记录下来。

问题描述

使用了 Anaconda 的虚拟环境,并且确认已经安装过 OpenCV

运行 Python,直接 xxx(不可描述)。

1
2
3
4
Traceback (most recent call last):
File "/home/askeynil/Desktop/cv/class/1. demo.py", line 1, in <module>
import cv2 as cv
ImportError: /opt/ros/kinetic/lib/python2.7/dist-packages/cv2.so: undefined symbol: PyCObject_Type
阅读全文

官方例程:https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_imgproc/py_watershed/py_watershed.html?highlight=coins

简单描述

coins

  1. 获取需要分割的图片
  2. 转化为灰度图
  3. 转化为二值图
  4. 转化为距离图
  5. 分离距离图,转化为二值图
  6. 查找距离二值图的轮廓
  7. 给二值图轮廓中的每个点进行颜色标记,从1开始标记
  8. 将标记的图转化为固定类型的标记图(CV_32S类型)
  9. 在标记图中将二值图黑色的区域对应的位置设置标记为轮廓的数量加1。(非常重要,后面介绍)
  10. 使用分水岭算法将标记的图和原图关联起来。
  11. 给标记图中每块标记区域上色
阅读全文

以下只列举常用的方法和常用的参数,例如枚举,只会将最常用的几个列举出来,详细的请参考官方文档。

对于C++默认使用了using namespace cv;

对于Python默认使用了import cv2 as cvimport numpy as np

OpenCV版本:3.4.7

读取图片

1
imread(filename, flags)
  1. filename:图片路径
  2. flags
    1. IMREAD_COLOR:默认值,返回3通道的BGR色彩图像
    2. IMREAD_GRAYSCALE:返回单通道灰色图片
    3. IMREAD_UNCHANGED:按原样返回。
阅读全文

图像的读写与显示

读取图像

使用函数 cv.imread() 来读取图像,该函数共两个参数

  1. 图像的路径
  2. 图像的读取方式
    1. cv.IMREAD_COLOR 加载彩色图像,图像的任何透明度都将被忽略。这是默认标志
    2. cv.IMREAD_GRAYSCALE 以灰度模式加载图像
    3. cv.IMREAD_UNCHANGED 加载图像,包括 alpha 通道

例:

1
2
3
import cv2 as cv

img = cv.imread("1.jpg", cv.IMREAD_COLOR)

警告:如果图像路径错误,它将不会引发任何错误,但是会返回一个空值

阅读全文

导入Matplotlib

约定俗成的以 plt 为 Matplotlib 简称的导入方式

1
import matplotlib.pyplot as plt

魔法配置,让表格显示在 jupyter 里面

1
%matplotlib notebook

中文字体支持配置

第一种方法

  1. 打印所有系统字体
1
2
for i in sorted([f.name for f in mpl.font_manager.fontManager.ttflist]):
print(i)
  1. 找到一个可以显示中文的字体
1
2
3
# 比如我使用的 Songti SC
# 将其设置为当前字体
plt.rcParams['font.family']=['Songti SC']
阅读全文

PyQt5是一条 Python 的 GUI 开发框架

PyQt5 的安装

  1. pip3 install PyQt5
  2. 在终端中输入 python3进入 python 解释器
  3. 输入以下代码from PyQt5 import QtWidgets
  4. 如果显示执行成功,即表示安装完成

PyQt 的模块介绍

PyQt 在运行时,有几句固定代码

  1. 导入需要的库
    1. import sys
    2. from PyQt5 import QtWidgets # 这部分导入根据需要使用的框架进行导入
  2. 创建和停止应用程序
    1. app = QtWidgets.QApplication(sys.argv) # 创建应用程序
    2. ... # 期间是程序需要执行的代码,比如创建界面和各种逻辑
    3. sys.exit(app.exec()) # 退出应用程序
阅读全文

函数

所谓函数,就是把一个具有独立功能的代码块组织成一个整体,在需要的时候调用。

函数的使用一般包含两个步骤:

  1. 定义函数:在函数中编写代码、实现功能
  2. 调用函数:执行编写的代码

好的函数,可以提高代码编写的效率,以及代码的复用性。

函数的定义

1
2
def 函数名():
执行的代码

函数的定义规范:

  1. defdefine的缩写
  2. 函数的名称应该能简单明确的表明函数的功能,比如 min()很清晰的表达了该函数就是用来求最小值的
  3. 函数名称的命名应该符合标识符的命名规则:
    • 只能由字母数字下划线组成
    • 不能以数字开头
    • 不能跟关键字重名

函数的执行过程

  1. 代码执行到函数定义时,不会走到函数的内部,只是将该函数名作为一个标识符,添加到内存中
  2. 当调用函数时,才会从内存中去查询该函数,并执行函数内部的相关代码
阅读全文

变量

变量的命名规则

  1. 只能有数字,字母,下划线(_)组成
  2. 不能以数字开头
  3. 不能是关键字
  4. 区分大小写

命名规范

  1. 下划线命名法
    • my_first_name
    • my_last_name
  2. 驼峰命名法
    1. 大驼峰
      • MyFirstName
      • MyLastName
    2. 小驼峰
      • myFirstName
      • myLastName

变量类型

变量类型分为:数值型非数值型

数值型

数据类型 描述
int 整型
float 浮点型
bool 布尔型
complex 复数型
阅读全文