OpenCV训练题

一、创建一个 PyQt 应用程序,该应用程序能够:

  1. 使用 OpenCV 加载一张图像。
  2. 在 PyQt 的窗口中显示这张图像。
  3. 提供四个按钮(QPushButton):
  • 一个用于将图像转换为灰度图
  • 一个用于将图像恢复为原始彩色图
  • 一个用于将图像进行翻转
  • 一个用于将图像进行旋转
  • 4.当用户点击按钮时,相应地更新窗口中显示的图像。
import sys
import cv2
from PyQt6.QtGui import QImage, QPixmap
from PyQt6.QtWidgets import QWidget, QApplication, QLabel, QPushButton
from PyQt6 import uic


# 封装一个我的窗口类
class MyWidget(QWidget):
    def __init__(self):
        super().__init__()
        # 通过 uic 将 ui 界面加载到程序中来
        ui = uic.loadUi("./form.ui", self)

        # 加载图像
        self.original_image = cv2.imread("../images/lena.png")
        if self.original_image is None:
            print("无法加载图像,请检查图像路径。")
            sys.exit(1)
        self.current_image = self.original_image.copy()

        self.label: QLabel = ui.label
        self.btn1: QPushButton = ui.btn1
        self.btn2: QPushButton = ui.btn2
        self.btn3: QPushButton = ui.btn3
        self.btn4: QPushButton = ui.btn4

        # 显示原始图像
        self.display_image(self.current_image)
        self.label.setScaledContents(True)

        # 连接按钮信号和槽函数
        self.btn1.clicked.connect(self.convert_to_gray)
        self.btn2.clicked.connect(self.restore_color)
        self.btn3.clicked.connect(self.flip_image)
        self.btn4.clicked.connect(self.rotate_image)

    def display_image(self, image):
        height, width, channel = image.shape
        bytes_per_line = 3 * width
        q_img = QImage(image.data, width, height, bytes_per_line, QImage.Format.Format_BGR888)
        pixmap = QPixmap.fromImage(q_img)
        self.label.setPixmap(pixmap)

    def convert_to_gray(self):
        self.current_image = cv2.cvtColor(self.current_image, cv2.COLOR_BGR2GRAY)
        self.current_image = cv2.cvtColor(self.current_image, cv2.COLOR_GRAY2BGR)
        self.display_image(self.current_image)

    def restore_color(self):
        self.current_image = self.original_image.copy()
        self.display_image(self.current_image)

    def flip_image(self):
        self.current_image = cv2.flip(self.current_image, 1)
        self.display_image(self.current_image)

    def rotate_image(self):
        self.current_image = cv2.rotate(self.current_image, cv2.ROTATE_90_CLOCKWISE)
        self.display_image(self.current_image)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    myWidget = MyWidget()
    myWidget.show()
    sys.exit(app.exec())

结果展示:

二、创建一个 PyQt 应用程序,该应用程序能够:

  1. 使用 OpenCV 加载一张彩色图像,并在 PyQt 的窗口中显示它。
  2. 提供一个滑动条(QSlider),允许用户调整图像的亮度。
  3. 当用户调整滑动条时,实时更新窗口中显示的图像亮度。
  4. 添加另一个滑动条(QSlider),允许用户调整图像的对比度。
  5. 当用户调整滚动条时,实时更新窗口中显示的图像对比度。
  6. 提供一个按钮(QPushButton),允许用户将图像保存为新的文件。
  7. 当用户点击保存按钮时,将调整后的图像保存到指定的路径,OpenCV中使用cv2.imwrite()来保存图片。
import sys
import cv2
from PyQt6.QtGui import QImage, QPixmap
from PyQt6.QtWidgets import QWidget, QApplication, QLabel, QPushButton, QSlider, QFileDialog
from PyQt6 import uic


class MyWidget(QWidget):
    def __init__(self):
        super().__init__()
        # 通过 uic 将 ui 界面加载到程序中来
        ui = uic.loadUi("./form1.ui", self)

        self.original_image = cv2.imread("../images/lena.png")
        if self.original_image is None:
            print("无法加载图像,请检查图像路径。")
            sys.exit(1)
        self.current_image = self.original_image.copy()

        self.label: QLabel = ui.label
        self.Slider1: QSlider = ui.Slider1
        self.Slider2: QSlider = ui.Slider2
        self.pushButton: QPushButton = ui.pushButton

        # 初始化滑动条范围
        self.Slider1.setRange(-100, 100)
        self.Slider2.setRange(0, 200)
        self.Slider1.setValue(0)
        self.Slider2.setValue(100)

        # 连接信号和槽
        self.Slider1.valueChanged.connect(self.adjust_brightness)
        self.Slider2.valueChanged.connect(self.adjust_contrast)
        self.pushButton.clicked.connect(self.save_image)

        self.display_image(self.current_image)
        self.label.setScaledContents(True)

    def display_image(self, image):
        height, width, channel = image.shape
        bytes_per_line = 3 * width
        q_img = QImage(image.data, width, height, bytes_per_line, QImage.Format.Format_BGR888)
        pixmap = QPixmap.fromImage(q_img)
        self.label.setPixmap(pixmap)

    def adjust_brightness(self, value):
        # 调整亮度
        alpha = 1.0
        beta = value
        self.current_image = cv2.convertScaleAbs(self.original_image, alpha=alpha, beta=beta)
        self.display_image(self.current_image)

    def adjust_contrast(self, value):
        # 调整对比度
        alpha = value / 100.0
        beta = 0
        self.current_image = cv2.convertScaleAbs(self.original_image, alpha=alpha, beta=beta)
        self.display_image(self.current_image)

    def save_image(self):
        # 选择保存路径
        file_path, _ = QFileDialog.getSaveFileName(self, "保存图像", "", "图像文件 (*.png *.jpg *.jpeg)")
        if file_path:
            try:
                cv2.imwrite(file_path, self.current_image)
                print(f"图像已保存到 {file_path}")
            except Exception as e:
                print(f"保存图像时出错: {e}")


if __name__ == '__main__':
    app = QApplication(sys.argv)
    myWidget = MyWidget()
    myWidget.show()
    sys.exit(app.exec())

 结果展示:

三、创建一个 PyQt 应用程序,该应用程序能够:

  1. 使用 OpenCV 加载一张图像。
  2. 在 PyQt 的窗口中显示这张图像。
  3. 提供一个下拉列表(QComboBox),对图像做(模糊、锐化、边缘检测)处理:
  • 模糊——使用cv2.GaussianBlur()实现
  • 锐化——使用cv2.Laplacian()、cv2.Sobel()实现
  • 边缘检测——使用cv2.Canny()实现
  1. 当用户点击下拉列表选项时,相应地更新窗口中显示的图像。
  2. 提供一个按钮,当用户点击按钮时,能保存调整后的图像。

import sys
import cv2
from PyQt6.QtGui import QImage, QPixmap
from PyQt6.QtWidgets import QWidget, QApplication, QLabel, QPushButton, QSlider, QFileDialog, QComboBox
from PyQt6 import uic


# 封装一个我的窗口类
class MyWidget(QWidget):
    def __init__(self):
        super().__init__()
        # 通过uic将ui界面加载到程序中来
        ui = uic.loadUi("./form2.ui",self)

        self.original_image = cv2.imread("../images/lena.png")
        if self.original_image is None:
            print("无法加载图像,请检查图像路径。")
            sys.exit(1)
        self.current_image = self.original_image.copy()

        self.label: QLabel = ui.label
        self.comboBox:QComboBox = ui.comboBox
        self.pushButton:QPushButton = ui.pushButton

        self.comboBox.addItems(["原始图像","模糊处理","锐化处理","边缘检测"])

        self.display_image(self.current_image)
        self.label.setScaledContents(True)

        self.comboBox.currentIndexChanged.connect(self.comboBox_slot)
        self.pushButton.clicked.connect(self.save_image)

    def display_image(self, image):
        height, width, channel = image.shape
        bytes_per_line = 3 * width
        q_img = QImage(image.data, width, height, bytes_per_line, QImage.Format.Format_BGR888)
        pixmap = QPixmap.fromImage(q_img)
        self.label.setPixmap(pixmap)

    def comboBox_slot(self):
        if self.comboBox.currentText() == "原始图像":
            self.current_image = self.original_image.copy()
        elif self.comboBox.currentText() == "模糊处理":
            self.current_image = cv2.GaussianBlur(self.original_image,(5,5),0)
        elif self.comboBox.currentText() == "锐化处理":
            laplacian = cv2.Laplacian(self.original_image,cv2.CV_64F)
            self.current_image = cv2.convertScaleAbs(laplacian)
        elif self.comboBox.currentText() == "边缘检测":
            # 使用 Canny 边缘检测
            self.current_image = cv2.Canny(self.original_image, 100, 200)
            # 转换为三通道图像以便显示
            self.current_image = cv2.cvtColor(self.current_image, cv2.COLOR_GRAY2BGR)

        self.display_image(self.current_image)

    def save_image(self):
        # 选择保存路径
        file_path, _ = QFileDialog.getSaveFileName(self, "保存图像", "", "图像文件 (*.png *.jpg *.jpeg)")
        if file_path:
            try:
                cv2.imwrite(file_path, self.current_image)
                print(f"图像已保存到 {file_path}")
            except Exception as e:
                print(f"保存图像时出错: {e}")


if __name__ == '__main__':
    app = QApplication(sys.argv)
    myWidget = MyWidget()
    myWidget.show()
    sys.exit(app.exec())

结果展示:

 

四、请编写一段Python代码,实现以下功能:

  1. 读取一张二维码图片
  2. 进行二值化处理和形态学操作,获取二维码轮廓
  3. 通过轮廓外接特征检测或者多边形逼近等获取 二维码的四个点
  4. 进行透视变换,矫正二维码图像
import cv2
import numpy as np


def order_points(pts):
    """对四个点进行排序:左上,右上,右下,左下"""
    rect = np.zeros((4, 2), dtype="float32")
    s = pts.sum(axis=1)
    rect[0] = pts[np.argmin(s)]  # 左上(x+y最小)
    rect[2] = pts[np.argmax(s)]  # 右下(x+y最大)

    diff = np.diff(pts, axis=1)
    rect[1] = pts[np.argmin(diff)]  # 右上(y-x最小)
    rect[3] = pts[np.argmax(diff)]  # 左下(y-x最大)
    return rect


# 1. 读取图片
image = cv2.imread('../images/erwei.jpg')
image = cv2.resize(image,(0,0),fx=0.5,fy=0.5)
orig = image.copy()

# 2. 预处理
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
blur = cv2.GaussianBlur(gray, (5, 5), 0)
_, thresh = cv2.threshold(blur, 127, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)

# 形态学操作(闭运算填充内部空隙)
kernel = np.ones((3, 3), np.uint8)
closed = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel, iterations=2)

# 3. 轮廓检测
contours, _ = cv2.findContours(closed, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

# 筛选最大轮廓并进行多边形逼近
max_area = 0
screen_pts = None
for cnt in contours:
    area = cv2.contourArea(cnt)
    if area < 1000:  # 过滤小面积噪声
        continue
    peri = cv2.arcLength(cnt, True)
    approx = cv2.approxPolyDP(cnt, 0.02 * peri, True)
    if len(approx) == 4:
        if area > max_area:
            max_area = area
            screen_pts = approx.reshape(4, 2)

if screen_pts is None:
    raise ValueError("未检测到二维码轮廓")

# 4. 透视变换
rect = order_points(screen_pts)
(tl, tr, br, bl) = rect

# 计算目标图像尺寸
width_a = np.linalg.norm(br - bl)
width_b = np.linalg.norm(tr - tl)
max_width = max(int(width_a), int(width_b))

height_a = np.linalg.norm(tr - br)
height_b = np.linalg.norm(tl - bl)
max_height = max(int(height_a), int(height_b))

# 目标点坐标
dst = np.array([
    [0, 0],
    [max_width - 1, 0],
    [max_width - 1, max_height - 1],
    [0, max_height - 1]], dtype="float32")

# 计算变换矩阵并执行变换
M = cv2.getPerspectiveTransform(rect, dst)
warped = cv2.warpPerspective(orig, M, (max_width, max_height))

# 显示结果
cv2.imshow("Original", orig)
cv2.imshow("Corrected QR Code", warped)
cv2.waitKey(0)
cv2.destroyAllWindows()

五、 请编写一段Python代码,实现以下功能:

  1. 读取一张彩色图像
  2. 制作要提取颜色的掩膜
  3. 输出抠图后的前景图 和 背景图

import cv2
import numpy as np

def extract_colors(image_path):
    # 1. 读取彩色图像
    img = cv2.imread(image_path)
    hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

    # 2. 定义颜色范围(示例:提取红色系)
    # 可根据需求修改阈值范围
    lower_red1 = np.array([0, 43, 46])     # 红色HSV下限1
    upper_red1 = np.array([10, 255, 255])    # 红色HSV上限1
    lower_red2 = np.array([156, 43, 46])   # 红色HSV下限2(处理色相环闭合)
    upper_red2 = np.array([180, 255, 255])   # 红色HSV上限2

    # 生成掩膜
    mask1 = cv2.inRange(hsv, lower_red1, upper_red1)
    mask2 = cv2.inRange(hsv, lower_red2, upper_red2)
    mask = cv2.bitwise_or(mask1, mask2)

    # 形态学优化(填充空洞、去除噪声)
    kernel = np.ones((5,5), np.uint8)
    mask = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel, iterations=2)
    mask = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel, iterations=1)

    # 3. 分割前景和背景
    foreground = cv2.bitwise_and(img, img, mask=mask)
    background = cv2.bitwise_and(img, img, mask=cv2.bitwise_not(mask))

    # 4. 显示结果
    # cv2.imshow("Original", img)
    cv2.imshow("Foreground", foreground)
    cv2.imshow("Background", background)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

# 执行函数(替换为你的图片路径)
extract_colors("../images/redflowers.png")

 结果展示:

<think>嗯,用户想要寻找与OpenCV相关的面试目,常见问和技术面试资料。我需要先整理一下OpenCV的基础知识,比如图像处理基础、常用函数、算法原理等。然后还要考虑实际应用和编程,比如代码实现或性能优化。同时,用户提到了参考引用中的资料,可能需要结合那些内容来给出更具体的目。 首先,图像处理基础部分,常见的问可能包括颜色空间转换、图像读取和保存、图像滤波方法等。比如,用户可能会被问到如何将BGR转换为灰度图,或者高斯滤波和中值滤波的区别。这些都需要详细解释,确保答案准确。 接下来是算法原理,比如边缘检测中的Canny算法步骤,Haar特征和HOG特征的区别,SIFT和SURF的原理等。这些问需要深入理解相关算法的流程和数学基础,比如Canny的非极大值抑制和双阈值检测步骤。 实际应用方面,用户可能关心如何实现人脸检测或图像拼接。这里需要提到使用Haar级联分类器或特征匹配算法,比如RANSAC在图像拼接中的应用。这部分需要结合OpenCV的具体函数,如cv2.CascadeClassifier或cv2.Stitcher。 编程部分,可能会涉及读取图像、调整大小、滤波处理、绘制图形等。比如,加载图像并转换为HSV空间,或者使用霍夫变换检测直线。这些目需要代码示例,并且要确保代码语法正确,符合OpenCV的最新版本。 性能优化和工程实践也是重点,比如处理大图像时的优化方法,多线程处理,内存管理,或者处理摄像头视频流。这里可能需要提到图像金字塔、ROI区域、或使用CUDA加速。 然后,结合用户提供的引用资料,引用[4]提到图像格式支持和噪声处理,可以相关问涉及图像格式的支持和编解码库,或者不同滤波器的应用场景。引用[3]中的面试库和知识体系,可能需要强调算法和大数据组件,但这里主要聚焦在OpenCV上。 最后,要确保生成的问覆盖各个难度层次,从基础到高级,并且问之间有逻辑连贯性。同时,检查是否有遗漏的重要主,比如机器学习在OpenCV中的应用,或者深度学习模型与OpenCV的集成,比如YOLO或TensorFlow模型的部署。 总结一下,我需要分门别类地整理问,涵盖基础概念、算法原理、实际应用、编程实现、性能优化等方面,并确保每个问都有对应的知识点和可能的扩展方向。同时,参考用户提供的引用资料,特别是关于图像处理和面试的部分,来增强答案的相关性和准确性。</think>### OpenCV 常见面试目与知识点梳理 --- #### **一、基础概念与图像处理** 1. **图像的基本操作** - **问**:如何用OpenCV将BGR格式图像转换为灰度图?请写出代码。 **答案**:使用`cv2.cvtColor`函数: ```python gray_image = cv2.cvtColor(bgr_image, cv2.COLOR_BGR2GRAY) ``` 引用[^1]提到OpenCV的图像处理函数是面试高频考点。 - **问**:解释图像二值化的作用及`cv2.threshold`的参数含义。 **答案**:二值化将图像像素分为两类(如黑白),`cv2.threshold(src, thresh, maxval, type)`中: - `thresh`:阈值 - `maxval`:超过阈值时的最大值 - `type`:阈值类型(如`cv2.THRESH_BINARY`)。 2. **图像滤波与噪声处理** - **问**:高斯滤波和中值滤波的区别是什么?分别适用于什么场景? **答案**: - 高斯滤波通过加权平均消除高斯噪声,适合平滑图像。 - 中值滤波用邻域中值替代中心像素,适合椒盐噪声[^4]。 - **问**:如何用OpenCV实现边缘保留滤波(如双边滤波)? **代码示例**: ```python blurred = cv2.bilateralFilter(image, d=9, sigmaColor=75, sigmaSpace=75) ``` --- #### **二、算法与原理** 1. **特征提取与匹配** - **问**:描述SIFT算法的关键步骤及其优势。 **答案**: 1. 尺度空间极值检测 2. 关键点定位 3. 方向分配 4. 生成描述子。 优势:对旋转、尺度、光照变化鲁棒。 - **问**:如何用OpenCV实现ORB特征匹配?写出关键代码。 **代码示例**: ```python orb = cv2.ORB_create() kp1, des1 = orb.detectAndCompute(img1, None) kp2, des2 = orb.detectAndCompute(img2, None) bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True) matches = bf.match(des1, des2) ``` 2. **目标检测与跟踪** - **问**:Haar级联分类器的原理是什么?如何训练自定义分类器? **答案**:基于Haar特征和Adaboost算法,通过积分图快速计算特征值。训练需使用`opencv_traincascade`工具,提供正负样本。 - **问**:解释光流法(Optical Flow)的Lucas-Kanade算法假设条件。 **答案**: 1. 亮度恒定 2. 时间连续(微小运动) 3. 空间一致性(邻域内运动一致)[^2]。 --- #### **三、工程实践与优化** 1. **性能优化** - **问**:如何处理大尺寸图像的实时处理需求? **答案**: - 使用图像金字塔降低分辨率 - ROI(感兴趣区域)局部处理 - 并行化(如OpenMP或GPU加速)。 - **问**:OpenCV中如何利用CUDA加速图像处理? **答案**:需编译支持CUDA的OpenCV版本,调用`cv2.cuda`模块的函数,如`cv2.cuda_GpuMat`。 2. **实际应用** - **问**:如何实现摄像头视频流的实时人脸检测? **代码框架**: ```python cap = cv2.VideoCapture(0) face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml') while True: ret, frame = cap.read() gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) faces = face_cascade.detectMultiScale(gray, 1.3, 5) # 绘制检测框并显示 ``` --- #### **四、进阶问** 1. **深度学习与OpenCV** - **问**:如何用OpenCV部署YOLOv5模型进行目标检测? **步骤**: 1. 加载ONNX模型:`net = cv2.dnn.readNet('yolov5s.onnx')` 2. 预处理图像并输入网络 3. 解析输出层,绘制检测框。 - **问**:解释OpenCV的DNN模块支持哪些框架的模型。 **答案**:支持TensorFlow、PyTorch(需转ONNX)、Caffe等。 --- #### **§§ 相关问 §** 1. OpenCV中如何实现图像透视变换? 2. 解释霍夫变换在直线检测中的应用及参数调优方法。 3. 如何优化OpenCV代码以减少内存占用? 4. OpenCV与TensorRT集成时需要注意哪些问? 5. 在移动端部署OpenCV模型有哪些优化策略? --- **参考资料** : OpenCV图像处理核心函数与算法总结。 : 商汤科技机器视觉面试中的光流法考点。 [^4]: OpenCV图像编解码库与噪声处理技术。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值