HNU计算机视觉作业二

news2024/11/23 12:30:26

前言

选修的是蔡mj老师的计算机视觉,上课还是不错的,但是OpenCV可能需要自己学才能完整把作业写出来。由于没有认真学,这门课最后混了80多分,所以下面作业解题过程均为自己写的,并不是标准答案,仅供参考

任务1

修改test-2.py的task_one()函数,基于特征匹配和2D图像变换方法,以query_book.jpg中的书本为搜索目标,从search_book.jpg中检测出该书本的区域。具体输出要求如下:

(1)估计从query_book.jpg到search_book.jpg的2D变换矩阵(单应矩阵),并将单应矩阵的参数保存在下方空白区域

单应矩阵参数:

[[ 1.18057489e-01 -2.96697386e-02  1.21128139e+03]
 [-4.89878565e-01  2.85541672e-01  5.48692141e+02]
 [-2.67837932e-04 -2.40726966e-04  1.00000000e+00]]

(2)用白色线段在search_book.jpg中画出书本检测区域的四个边界,并对query_book.jpg和search_book.jpg之间的匹配特征点对进行可视化,可视化结果保存为task1_result.jpg

提示:可以使用OpenCV的drawMatches函数对两个图像的匹配特征点对进行可视化

请添加图片描述
请添加图片描述

def task_one():
    """
    object detection based on feature matching and 2D image transformation
    """
    MIN_MATCH_COUNT = 20

    img1 = cv2.imread('query_book.jpg') # queryImage
    img2 = cv2.imread('search_book.jpg') # trainImage
    
    img1 = cv2.cvtColor(img1,cv2.COLOR_BGR2GRAY)
    img2 = cv2.cvtColor(img2,cv2.COLOR_BGR2GRAY)
    
    # --------Your code--------
    # Initiate ORB detector
    orb = cv2.ORB_create(nfeatures=1500)
    # find the keypoints and descriptors
    kp1,des1 = orb.detectAndCompute(img1, None)
    kp2,des2 = orb.detectAndCompute(img2, None)  # BFMatcher with default params
    bf = cv2.BFMatcher(cv2.NORM_HAMMING)  # returns k best matches
    matches = bf.knnMatch(des1, des2,k = 2)
    # Apply ratio test.
    good =[]
    for m, n in matches:
        if m.distance < 0.75 * n.distance:
            good.append(m)
    if len(good) > MIN_MATCH_COUNT:
        src_pts = np.float32([kp1[m.queryIdx].pt for m in good]).reshape(-1, 1, 2)
        dst_pts = np.float32([kp2[m.trainIdx].pt for m in good]).reshape(-1, 1,2)
        M, mask = cv2.findHomography(src_pts,dst_pts,cv2.RANSAC,5.0)
        matchesMask =mask.ravel().tolist()
        h, w=img1.shape
        pts = np.float32([[0, 0], [0, h - 1], [w - 1, h - 1], [w - 1, 0]]).reshape(-1, 1, 2)
        dst = cv2.perspectiveTransform(pts, M)
        img2 = cv2.polylines(img2, [np.int32(dst)], True, 255, 3, cv2.LINE_AA)
    else:
        print("Not enough matches are found - %d/%d" % (len(good), MIN_MATCH_COUNT))
        matchesMask = None

    draw_params = dict(matchColor=(0, 255, 0),
                                    singlePointColor = None,
                                    matchesMask = matchesMask,
                                    flags = 2)

    img3 = cv2.drawMatches(img1, kp1, img2, kp2, good, None, **draw_params)
    #print(M)

    #plt.imshow(cv2.cvtColor(img3, cv2.COLOR_BGR2RGB))
    #plt.show()
    cv2.imwrite("task1_result.jpg", img3)

结果如下:
请添加图片描述

任务2

修改test-2.py的task_two()函数,基于left01.jpg, left02.jpg, …, left08.jpg等8个图像进行相机校准。具体输出要求如下:

(1)将相机校准得到的相机内部矩阵参数(intrinsic parameters)保存在下方空白区域

相机内部矩阵参数:

[[534.17982188   0.         341.22392645]
 [  0.         534.42712122 233.96164532]
 [  0.           0.           1.        ]]

(2)在left03.jpg上对于世界坐标系的三个坐标轴(例如从坐标原点到[3,0,0], [0,3,0], [0,0,-3]的三个线段)进行可视化,可视化结果保存为task2_result.jpg
提示:可以使用OpenCV的findChessboardCorners函数自动检测每个图像中的特征点;可以使用OpenCV的projectPoints函数将世界坐标系中的三维坐标转换为图像中的二维坐标

请添加图片描述

def task_two():
    """
    camera calibration and 3D visualization
    """
    criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30,0.001)
    objp = np.zeros((6 * 7, 3),np.float32)
    objp[:, :2] = np.mgrid[0:7, 0:6].T.reshape(-1, 2)

    objpoints =[]  # 3d point in real world
    imgpoints =[] # 2d points in image plane.


    images = glob.glob('left0*.jpg')

    # --------Your code--------

    for fname in images:
        img = cv2.imread(fname)
        gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

        ret,corners = cv2.findChessboardCorners(gray,(7, 6), None)
        if ret == True:
            objpoints.append(objp)
            corners2 = cv2.cornerSubPix(gray, corners, (11, 11),(-1, -1), criteria)
            imgpoints.append(corners2)

    ret,mtx,dist,rvecs,tvecs = cv2.calibrateCamera(objpoints,imgpoints, gray.shape[::-1], None, None)
    np.savez('cameraParams', mtx=mtx,dist=dist)
    #print(mtx)


    criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)
    objp = np.zeros((6 * 7, 3), np.float32)
    objp[:, :2] = np.mgrid[0:7, 0:6].T.reshape(-1, 2)
    axis = np.float32([[3, 0, 0], [0, 3, 0], [0, 0, -3]]).reshape(-1, 3)

    img1 = cv2.imread('left03.jpg')
    gray = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
    ret, corners = cv2.findChessboardCorners(gray, (7, 6), None)
    if ret == True:
        corners2 = cv2.cornerSubPix(gray, corners, (11, 11), (-1, -1), criteria)
        # 找到旋转和平移矢量。
        ret, rvecs, tvecs = cv2.solvePnP(objp, corners2, mtx, dist)
        # 将3D点投影到图像平面
        imgpts, jac = cv2.projectPoints(axis, rvecs, tvecs, mtx, dist)
        pt1 = tuple(map(int, np.around(corners2[0].ravel())))
        pt2 = tuple(map(int, np.around(imgpts[0].ravel())))
        pt3 = tuple(map(int, np.around(imgpts[1].ravel())))
        pt4 = tuple(map(int, np.around(imgpts[2].ravel())))
        img1 = cv2.line(img1, pt1, pt2, (255, 0, 0), 5)
        img1 = cv2.line(img1, pt1, pt3, (0, 255, 0), 5)
        img1 = cv2.line(img1, pt1, pt4, (0, 0, 255), 5)
    # plt.imshow(cv2.cvtColor(img1, cv2.COLOR_BGR2RGB))
    # plt.title('left03.jpg axis: blue(x) green(y) red(-z)'), plt.xticks([]), plt.yticks([])
    # plt.show()
    
    cv2.imwrite("task2_result.jpg", img1)

结果如下:

请添加图片描述

任务3

修改test-2.py的task_three()函数,基于task3-1.jpg和task3-2.jpg之间的特征匹配进行相机运动估计。具体输出要求如下:

(1)估计两个图像之间的基本矩阵(fundamental matrix),参数保存在下方空白区域

基本矩阵参数:

[[ 5.87283710e-09  4.80576302e-07 -2.32905631e-04]
 [ 3.27541245e-06 -6.14881359e-08 -9.80274096e-03]
 [-1.51211294e-03  7.89845687e-03  1.00000000e+00]]

(2)对两个图像的匹配特征点和极线(epipolar line)进行可视化,可视化结果分别保存为task3-1_result.jpg和task3-2_result.jpg

提示:可以使用OpenCV的computeCorrespondEpilines函数,基于某个图像的匹配特征点计算在另一图像上对应的极线参数
请添加图片描述
请添加图片描述

def task_three():
    """
    fundamental matrix estimation and epipolar line visualization
    """

    img1 = cv2.imread('task3-1.jpg')  # left image
    img2 = cv2.imread('task3-2.jpg') # right image
    
    img1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
    img2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)
    
    # --------Your code--------

    sift = cv2.SIFT_create()
    kp1, des1 = sift.detectAndCompute(img1, None)
    kp2, des2 = sift.detectAndCompute(img2, None)
    FLANN_INDEX_KDTREE = 1
    index_params = dict(algorithm=FLANN_INDEX_KDTREE, trees=5)
    search_params = dict(checks=50)
    flann = cv2.FlannBasedMatcher(index_params, search_params)
    matches = flann.knnMatch(des1, des2, k=2)
    good = []
    pts1 = []
    pts2 = []
    # 根据Lowe的论文进行比率测试
    for i, (m, n) in enumerate(matches):
        if m.distance < 0.8 * n.distance:
            good.append(m)
            pts2.append(kp2[m.trainIdx].pt)
            pts1.append(kp1[m.queryIdx].pt)
    pts1 = np.int32(pts1)
    pts2 = np.int32(pts2)
    F, mask = cv2.findFundamentalMat(pts1, pts2, cv2.FM_LMEDS)
    print(F)
    # 我们只选择内点
    pts1 = pts1[mask.ravel() == 1]
    pts2 = pts2[mask.ravel() == 1]

    def drawlines(img1, img2, lines, pts1, pts2):
        ''' img1 - 我们在img2相应位置绘制极点生成的图像
            lines - 对应的极点 '''
        r, c = img1.shape
        img1 = cv2.cvtColor(img1, cv2.COLOR_GRAY2BGR)
        img2 = cv2.cvtColor(img2, cv2.COLOR_GRAY2BGR)
        for r, pt1, pt2 in zip(lines, pts1, pts2):
            color = tuple(np.random.randint(0, 255, 3).tolist())
            x0, y0 = map(int, [0, -r[2] / r[1]])
            x1, y1 = map(int, [c, -(r[2] + r[0] * c) / r[1]])
            img1 = cv2.line(img1, (x0, y0), (x1, y1), color, 1)
            img1 = cv2.circle(img1, tuple(pt1), 5, color, -1)
            img2 = cv2.circle(img2, tuple(pt2), 5, color, -1)
        return img1, img2

    # 在右图(第二张图)中找到与点相对应的极点,然后在左图绘制极线
    lines1 = cv2.computeCorrespondEpilines(pts2.reshape(-1, 1, 2), 2, F)
    lines1 = lines1.reshape(-1, 3)
    img5, img6 = drawlines(img1, img2, lines1, pts1, pts2)
    # 在左图(第一张图)中找到与点相对应的Epilines,然后在正确的图像上绘制极线
    lines2 = cv2.computeCorrespondEpilines(pts1.reshape(-1, 1, 2), 1, F)
    lines2 = lines2.reshape(-1, 3)
    img3, img4 = drawlines(img2, img1, lines2, pts2, pts1)
    # plt.subplot(121), plt.imshow(img5)
    # plt.subplot(122), plt.imshow(img3)
    # plt.show()
    # plt.imshow(cv2.cvtColor(img5, cv2.COLOR_BGR2RGB))
    # plt.show()
    # plt.imshow(cv2.cvtColor(img3, cv2.COLOR_BGR2RGB))
    # plt.show()
    
    cv2.imwrite("task3-1_result.jpg", img5)
    cv2.imwrite("task3-2_result.jpg", img3)

结果如下:
请添加图片描述
请添加图片描述

源代码

# -*- coding: utf-8 -*-
"""
Created on Tue Apr 25 16:24:14 2023

@author: cai-mj
"""

import numpy as np
import cv2
from matplotlib import pyplot as plt
import glob


def task_one():
    """
    object detection based on feature matching and 2D image transformation
    """
    MIN_MATCH_COUNT = 20

    img1 = cv2.imread('query_book.jpg') # queryImage
    img2 = cv2.imread('search_book.jpg') # trainImage
    
    img1 = cv2.cvtColor(img1,cv2.COLOR_BGR2GRAY)
    img2 = cv2.cvtColor(img2,cv2.COLOR_BGR2GRAY)
    
    # --------Your code--------
    # Initiate ORB detector
    orb = cv2.ORB_create(nfeatures=1500)
    # find the keypoints and descriptors
    kp1,des1 = orb.detectAndCompute(img1, None)
    kp2,des2 = orb.detectAndCompute(img2, None)  # BFMatcher with default params
    bf = cv2.BFMatcher(cv2.NORM_HAMMING)  # returns k best matches
    matches = bf.knnMatch(des1, des2,k = 2)
    # Apply ratio test.
    good =[]
    for m, n in matches:
        if m.distance < 0.75 * n.distance:
            good.append(m)
    if len(good) > MIN_MATCH_COUNT:
        src_pts = np.float32([kp1[m.queryIdx].pt for m in good]).reshape(-1, 1, 2)
        dst_pts = np.float32([kp2[m.trainIdx].pt for m in good]).reshape(-1, 1,2)
        M, mask = cv2.findHomography(src_pts,dst_pts,cv2.RANSAC,5.0)
        matchesMask =mask.ravel().tolist()
        h, w=img1.shape
        pts = np.float32([[0, 0], [0, h - 1], [w - 1, h - 1], [w - 1, 0]]).reshape(-1, 1, 2)
        dst = cv2.perspectiveTransform(pts, M)
        img2 = cv2.polylines(img2, [np.int32(dst)], True, 255, 3, cv2.LINE_AA)
    else:
        print("Not enough matches are found - %d/%d" % (len(good), MIN_MATCH_COUNT))
        matchesMask = None

    draw_params = dict(matchColor=(0, 255, 0),
                                    singlePointColor = None,
                                    matchesMask = matchesMask,
                                    flags = 2)

    img3 = cv2.drawMatches(img1, kp1, img2, kp2, good, None, **draw_params)
    #print(M)

    #plt.imshow(cv2.cvtColor(img3, cv2.COLOR_BGR2RGB))
    #plt.show()
    cv2.imwrite("task1_result.jpg", img3)

def draw(img, corners, imgpts):


    return img
    
def task_two():
    """
    camera calibration and 3D visualization
    """
    criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30,0.001)
    objp = np.zeros((6 * 7, 3),np.float32)
    objp[:, :2] = np.mgrid[0:7, 0:6].T.reshape(-1, 2)

    objpoints =[]  # 3d point in real world
    imgpoints =[] # 2d points in image plane.


    images = glob.glob('left0*.jpg')

    # --------Your code--------

    for fname in images:
        img = cv2.imread(fname)
        gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

        ret,corners = cv2.findChessboardCorners(gray,(7, 6), None)
        if ret == True:
            objpoints.append(objp)
            corners2 = cv2.cornerSubPix(gray, corners, (11, 11),(-1, -1), criteria)
            imgpoints.append(corners2)

    ret,mtx,dist,rvecs,tvecs = cv2.calibrateCamera(objpoints,imgpoints, gray.shape[::-1], None, None)
    np.savez('cameraParams', mtx=mtx,dist=dist)
    #print(mtx)


    criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)
    objp = np.zeros((6 * 7, 3), np.float32)
    objp[:, :2] = np.mgrid[0:7, 0:6].T.reshape(-1, 2)
    axis = np.float32([[3, 0, 0], [0, 3, 0], [0, 0, -3]]).reshape(-1, 3)

    img1 = cv2.imread('left03.jpg')
    gray = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
    ret, corners = cv2.findChessboardCorners(gray, (7, 6), None)
    if ret == True:
        corners2 = cv2.cornerSubPix(gray, corners, (11, 11), (-1, -1), criteria)
        # 找到旋转和平移矢量。
        ret, rvecs, tvecs = cv2.solvePnP(objp, corners2, mtx, dist)
        # 将3D点投影到图像平面
        imgpts, jac = cv2.projectPoints(axis, rvecs, tvecs, mtx, dist)
        pt1 = tuple(map(int, np.around(corners2[0].ravel())))
        pt2 = tuple(map(int, np.around(imgpts[0].ravel())))
        pt3 = tuple(map(int, np.around(imgpts[1].ravel())))
        pt4 = tuple(map(int, np.around(imgpts[2].ravel())))
        img1 = cv2.line(img1, pt1, pt2, (255, 0, 0), 5)
        img1 = cv2.line(img1, pt1, pt3, (0, 255, 0), 5)
        img1 = cv2.line(img1, pt1, pt4, (0, 0, 255), 5)
    # plt.imshow(cv2.cvtColor(img1, cv2.COLOR_BGR2RGB))
    # plt.title('left03.jpg axis: blue(x) green(y) red(-z)'), plt.xticks([]), plt.yticks([])
    # plt.show()
    
    cv2.imwrite("task2_result.jpg", img1)

def task_three():
    """
    fundamental matrix estimation and epipolar line visualization
    """

    img1 = cv2.imread('task3-1.jpg')  # left image
    img2 = cv2.imread('task3-2.jpg') # right image
    
    img1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
    img2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)
    
    # --------Your code--------

    sift = cv2.SIFT_create()
    kp1, des1 = sift.detectAndCompute(img1, None)
    kp2, des2 = sift.detectAndCompute(img2, None)
    FLANN_INDEX_KDTREE = 1
    index_params = dict(algorithm=FLANN_INDEX_KDTREE, trees=5)
    search_params = dict(checks=50)
    flann = cv2.FlannBasedMatcher(index_params, search_params)
    matches = flann.knnMatch(des1, des2, k=2)
    good = []
    pts1 = []
    pts2 = []
    # 根据Lowe的论文进行比率测试
    for i, (m, n) in enumerate(matches):
        if m.distance < 0.8 * n.distance:
            good.append(m)
            pts2.append(kp2[m.trainIdx].pt)
            pts1.append(kp1[m.queryIdx].pt)
    pts1 = np.int32(pts1)
    pts2 = np.int32(pts2)
    F, mask = cv2.findFundamentalMat(pts1, pts2, cv2.FM_LMEDS)
    print(F)
    # 我们只选择内点
    pts1 = pts1[mask.ravel() == 1]
    pts2 = pts2[mask.ravel() == 1]

    def drawlines(img1, img2, lines, pts1, pts2):
        ''' img1 - 我们在img2相应位置绘制极点生成的图像
            lines - 对应的极点 '''
        r, c = img1.shape
        img1 = cv2.cvtColor(img1, cv2.COLOR_GRAY2BGR)
        img2 = cv2.cvtColor(img2, cv2.COLOR_GRAY2BGR)
        for r, pt1, pt2 in zip(lines, pts1, pts2):
            color = tuple(np.random.randint(0, 255, 3).tolist())
            x0, y0 = map(int, [0, -r[2] / r[1]])
            x1, y1 = map(int, [c, -(r[2] + r[0] * c) / r[1]])
            img1 = cv2.line(img1, (x0, y0), (x1, y1), color, 1)
            img1 = cv2.circle(img1, tuple(pt1), 5, color, -1)
            img2 = cv2.circle(img2, tuple(pt2), 5, color, -1)
        return img1, img2

    # 在右图(第二张图)中找到与点相对应的极点,然后在左图绘制极线
    lines1 = cv2.computeCorrespondEpilines(pts2.reshape(-1, 1, 2), 2, F)
    lines1 = lines1.reshape(-1, 3)
    img5, img6 = drawlines(img1, img2, lines1, pts1, pts2)
    # 在左图(第一张图)中找到与点相对应的Epilines,然后在正确的图像上绘制极线
    lines2 = cv2.computeCorrespondEpilines(pts1.reshape(-1, 1, 2), 1, F)
    lines2 = lines2.reshape(-1, 3)
    img3, img4 = drawlines(img2, img1, lines2, pts2, pts1)
    # plt.subplot(121), plt.imshow(img5)
    # plt.subplot(122), plt.imshow(img3)
    # plt.show()
    # plt.imshow(cv2.cvtColor(img5, cv2.COLOR_BGR2RGB))
    # plt.show()
    # plt.imshow(cv2.cvtColor(img3, cv2.COLOR_BGR2RGB))
    # plt.show()
    
    cv2.imwrite("task3-1_result.jpg", img5)
    cv2.imwrite("task3-2_result.jpg", img3)

if __name__ == '__main__':
    task_one()
    task_two()
    task_three()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1297513.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

mysql支持的整数类型、各类型整数能够表示的数值范围

MySQL :: MySQL 8.2 Reference Manual :: 11.1.2 Integer Types (Exact Value) - INTEGER, INT, SMALLINT, TINYINT, MEDIUMINT, BIGINT mysql支持的整数有&#xff1a;TINYINT、SMALLINT、MEDIUMINT、INT&#xff08;INT和INTEGER是同义词&#xff09;、BIGINT&#xff0c;各…

自动化测试框架需要具备哪些功能?

我们经常听说使用了某某框架&#xff0c;那框架究竟是什么呢&#xff1f;框架有什么优势和功能&#xff1f; 什么是自动化框架 自动化框架是包含了自动化测试的组织、执行、监控以及报告等流程的工具&#xff0c;是由多个工具、库、模块和API等组成的工具集。自动化框架的目标…

致远互联FE协作办公平台 SQL注入漏洞复现

0x01 产品简介 致远互联FE协作办公平台是一款为企业提供全方位协同办公解决方案的产品。它集成了多个功能模块,旨在帮助企业实现高效的团队协作、信息共享和文档管理。 0x02 漏洞概述 致远互联FE协作办公平台 editflow_manager.js、validate.jsp等接口处存在SQL注入漏洞,未经…

Android studio生成二维码

1.遇到的问题 需要生成一个二维码&#xff0c;可以使用zxing第三方组件&#xff0c;增加依赖。 //生成二维码 implementation com.google.zxing:core:3.4.1 2.代码 展示页面 <ImageViewandroid:id"id/qrCodeImageView"android:layout_width"150dp"an…

Epoll服务器(ET工作模式)

目录 Epoll ET服务器设计思路Connection类TcpServer类 回调函数Accepter函数Recever函数Sender函数Excepter函数 事件处理套接字相关接口封装运行Epoll服务器 Epoll ET服务器 设计思路 在epoll ET服务器中&#xff0c;我们需要处理如下几种事件&#xff1a; 读事件&#xff…

如何恢复已删除的 JPG/JPEG 文件的方法深度解析!

您是否意外丢失或删除了 JPG 或 JPEG 照片&#xff1f;幸运的是&#xff0c;您可以使用照片恢复工具将它们恢复。立即获取适用于 PC 的 JPEG 恢复工具 - 照片恢复&#xff1a; 照片是捕捉和重温生活中特殊时刻的最佳方式。因此&#xff0c;当我们由于硬盘崩溃、意外格式化磁盘…

WordPress限制搜索关键词实现搜索黑名单

昨天有位站长问我能不能限制WordPress的搜索关键词&#xff0c;因为有人利用他的网站搜索色情词汇&#xff0c;本来正常搜索没有影响的&#xff0c;但是在部分网站中&#xff0c;搜索关键词产生的搜索页会被搜索引擎收录&#xff0c;实现推广功能。 WordPress的关键词搜索限制实…

kubesphere安装后启用DevOps

官方文档&#xff1a;KubeSphere DevOps 系统 1、集群管理---定制资源定义 进入目录&#xff1a;集群管理---定制资源定义搜索&#xff1a;clusterconfiguration 点击 ks-installer 右侧的 &#xff0c;选择编辑 YAML 在该 YAML 文件中&#xff0c;搜索 devops&#xff0c;…

k8s上安装KubeSphere

安装KubeSphere 前置环境安装nfs-server文件系统配置nfs-client配置默认存储创建了一个存储类metrics-server集群指标监控组件 安装KubeSphere执行安装查看安装进度 前置环境 下载配置我都是以CentOS 7.9 安装 k8s(详细教程)文章的服务器作为示例&#xff0c;请自行修改为自己的…

uniapp实战 —— 骨架屏

1. 自动生成骨架屏代码 在微信开发者工具中&#xff0c;预览界面点击生成骨架屏 确定后&#xff0c;会自动打开骨架屏代码文件 pages\index\index.skeleton.wxml 2. 将骨架屏代码转换为vue文件 在项目中新建文件 src\pages\index\components\skeleton.vue 将pages\index\index…

centos 7.9 二进制部署 kubernetes v1.27.7

文章目录 1. 预备条件2. 基础配置2.1 配置root远程登录2.2 配置主机名2.3 安装 ansible2.4 配置互信2.5 配置hosts文件2.6 关闭防firewalld火墙2.7 关闭 selinux2.8 关闭交换分区swap2.9 修改内核参数2.10 安装iptables2.11 开启ipvs2.12 配置limits参数2.13 配置 yum2.14 配置…

Python接口自动化浅析登录接口测试实战

以下主要介绍接口概念、接口用例设计及登录接口测试实战。 1、什么是接口&#xff1f; 接口&#xff1a;检测外部系统与系统之间以及内部各个子系统之间的交互点。 通俗来说&#xff0c;接口就是连接前后端的桥梁&#xff0c;接口测试可以简单理解为脱离了前端的功能测试。 …

Java数据结构之《哈夫曼编码大全》(难度系数100)

一、前言&#xff1a; 这是怀化学院的&#xff1a;Java数据结构中的一道难度偏难(偏难理解)的一道编程题(此方法为博主自己研究与学习一名叫qing影的博主&#xff0c;问题基本解决&#xff0c;若有bug欢迎下方评论提出意见&#xff0c;我会第一时间改进代码&#xff0c;谢谢&am…

poe与chatgpt那个功能更强大

在当前的人工智能领域&#xff0c;Poe Al Chat以其卓越的聊天能力和实用的功能&#xff0c;受到了大家的广泛关注和喜爱。本文好为您个绍Poe Al Chat的功能&#xff0c;以及我们国内用户如何进行充值订阅。Poe Al Chat是一个基于OpenAl的GPT模型开发的人工智能聊天工具。它能够…

前端使用视频作为背景图的方法

实现思路 通过 video source 引入视频&#xff0c;并对视频播放属性进行设置&#xff0c;再通过 css 使视频覆盖背景即可。 代码 <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>有开发问题可联系作者</title>…

MarsEdit 5 for Mac(博客编辑软件) - 博客创作的完美拍档!

您是一位热爱写作和分享的博主吗&#xff1f;如果是的话&#xff0c;那么MarsEdit 5 for Mac将成为您创作之旅中的完美拍档&#xff01;这款博客编辑软件为Mac用户提供了无与伦比的便捷和灵活性。 MarsEdit 5具有直观的界面和强大的功能&#xff0c;让您轻松管理和编辑多个博客…

酷开科技以创新为动力用大数据提升品牌认知

在21世纪的今天&#xff0c;我们生活在一个被互联网深深改变的世界。互联网不仅改变了我们的生活方式&#xff0c;也正在改变我们的思维方式和工作方式。而互联网作为一种新的发展趋势&#xff0c;更是为我们提供了无数的机会和无限可能性&#xff0c;从电子商务时代到社交网络…

基于Maven构建OSGI应用(Maven和OSGI结合)

基于Maven构建OSGI应用。 使用Maven来构建项目&#xff0c;包括项目的创建、子模块buldle的创建等。使用OSGI来实现动态模块化管理&#xff0c;实现模块的热插拔效果&#xff08;即插即用&#xff09;。 创建一个Maven项目&#xff1a;helloworld&#xff0c;并在该项目下创建…

[ROS2] --- service

1 service介绍 1.1 service概念 话题通信是基于订阅/发布机制的&#xff0c;无论有没有订阅者&#xff0c;发布者都会周期发布数据&#xff0c;这种模式适合持续数据的收发&#xff0c;比如传感器数据。机器人系统中还有另外一些配置性质的数据&#xff0c;并不需要周期处理&…

迅为3588开发板 sudo: 无法解析主机:/DNS配置

环境申明 RK3588 ubuntu 22.04 jammy 迅为开发板 hostname 看是否有Host .&#xff0c;如果没有&#xff0c; sudo vim /etc/hostname在里面加一行&#xff0c;我这就这一个 iTOP-RK3588hosts 修改本地hosts sudo vim /etc/hosts127.0.0.1 localhost localhost iTOP-RK3…