Opencv高级图像处理

文章目录

Opencv高级图像处理

图像坐标

在这里插入图片描述

row=height=Point.y
col=width=Point.x

二值化

import cv2  
import numpy as np  

# 打开图像  
image_path = 'your_image_path.jpg'  # 图片路径  
image = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)  # 以灰度模式读取图像  

# 检查图像是否正确读取  
if image is None:  
    print(f"Could not open or find the image: {image_path}")  
    exit(0)  

# 选择二值化方法,这里使用简单的阈值法  
# 你可以调整阈值(127, 255)来得到不同的效果  
# 第一个参数是源图像,第二个参数是用于分类像素的阈值,  
# 第三个参数是赋予超过阈值的像素的新值,第四个参数是二值化的类型  
ret, binary_image = cv2.threshold(image, 127, 255, cv2.THRESH_BINARY)  

# 保存处理后的图像  
output_path = 'binary_image.jpg'  # 保存路径
cv2.imwrite(output_path, binary_image)

滤波

高斯滤波

blurred = cv2.GaussianBlur(image, (11, 11), 0)

中值滤波

result = cv2.medianBlur(image, 3)

开闭运算

op_open = cv2.morphologyEx(blurred_raw, cv2.MORPH_OPEN, k) # 开运算
op_close = cv2.morphologyEx(blurred_raw, cv2.MORPH_CLOSE, k) # 闭运算

检测

霍夫圆检测

函数 cv2.HoughCircles()

参数含义
image原始图像
method目前只支持cv2.HOUGH_GRADIENT
dp图像解析的反向比例。1为原始大小,2为原始大小的一半
minDist圆心之间的最小距离。过小会增加圆的误判,过大会丢失存在的圆
param1(maxval)Canny检测器的高阈值,用于检测边缘点的阈值,大于此值才被检测出来。
param2(minval)检测阶段圆心的累加器阈值(thresh)。越小的话,会增加不存在的圆;越大的话,则检测到的圆就更加接近完美的圆形,检测到圆所需要的最小边缘点数,边缘点数小于此值则舍弃。
minRadius检测的最小圆的半径
maxRadius检测的最大圆的半径
# 霍夫圆检测
circles = cv2.HoughCircles(image=raw, cv2.HOUGH_GRADIENT, dp=1, minDist=20, param1=150, param2=100,minRadius=0, maxRadius=0)

# 绘制检测圆
if circles is not None:
    print(f"检测到圆的个数:{len(circles)}")
    # print(f"{circles}")
    circles = np.round(circles[0, :]).astype("int")
    for (x, y, r) in circles:
        cv2.circle(image, (x, y), r, (0, 255, 0), 1)
else:
    print("未检测到圆")

边缘检测

Canny边缘检测
  • 目的:Canny边缘检测算法的目的是识别图像中的一维边缘。该算法通过多步骤过程检测图像中的边缘,包括平滑图像以减少噪声、计算图像梯度以找到潜在的边缘点、应用非极大值抑制(NMS)以获得细边缘,以及使用双阈值算法和边缘连接通过滞后阈值处理确定最终边缘。
  • 输出:Canny算法输出的是一个二值图像,其中边缘上的像素为白色(或1),其余像素为黑色(或0)。

在这里插入图片描述

edges = cv2.Canny(blurred_raw, threshold1=10, threshold2=70)
# edges 是检测之后的图像

原理:参考链接:知乎文章

findContours
  • 目的findContours函数的目的是从二值图像中提取轮廓线。轮廓可以被视为连续的点(沿着边界)组成的曲线,适用于形状分析和对象检测和识别。
  • 工作方式findContours通过追踪二值图像中的白色(或前景)部分的边缘来查找轮廓。这通常是在应用了阈值处理或边缘检测之后进行。
  • 输出:该函数返回两个主要的输出:轮廓本身(一个点的列表,这些点连续地定义了边界)和每个轮廓的层级信息(表示轮廓之间的父子关系)。
# 边缘检测
ret, thresh = cv2.threshold(src=blurred_image, thresh=60, maxval=255, type=0)
contours, hierarchy = cv2.findContours(image=thresh, mode=cv2.RETR_TREE, method=cv2.CHAIN_APPROX_SIMPLE)

# image,单通道图像矩阵,可以是灰度图,但更常用的是二值图像,一般是经过Canny、拉普拉斯等边缘检测算子处理过的二值图像

# 绘制边缘
image = cv2.drawContours(image=image, contours=contours, contourIdx=-1, color=(0, 255, 0), thickness=3)
区别
  • 应用场景:Canny边缘检测主要用于边缘识别,适合于图像中边缘的检测和跟踪。而findContours用于提取轮廓信息,适用于更高级的形状分析和对象识别。
  • 输出类型:Canny边缘检测输出一个二值图像,其中包含检测到的边缘。findContours则返回轮廓点的集合,这些点可以用来描述对象的形状。
  • 后续处理:Canny检测出的边缘通常用作其他图像处理操作的预处理步骤,比如轮廓提取。findContours通常是形状分析或对象识别流程中的一步,它依赖于边缘检测的结果。

简而言之,Canny边缘检测专注于识别图像中的边缘,而findContours则用于基于这些边缘或其他图像特征提取和分析轮廓。在许多实际应用中,这两个步骤经常连续使用:首先应用Canny边缘检测来找到边缘,然后使用findContours来提取这些边缘形成的轮廓。

傅里叶变换-高/低通滤波

使用傅里叶变换进行高/低通滤波。

import cv2  
import numpy as np  
from matplotlib import pyplot as plt  
  
def fourier_filter(image_path, output_path_lowpass, output_path_highpass, d0):  
    # 读取图像  
    img = cv2.imread(image_path, 0)  
      
    # 进行傅里叶变换  
    dft = cv2.dft(np.float32(img), flags=cv2.DFT_COMPLEX_OUTPUT)  
    dft_shift = np.fft.fftshift(dft)  
      
    # 创建低通和高通滤波器掩模  
    rows, cols = img.shape  
    crow, ccol = rows // 2, cols // 2  
    mask_lowpass = np.zeros((rows, cols, 2), np.uint8)  
    mask_highpass = np.ones((rows, cols, 2), np.uint8)  
    r = d0 // 2  
    center = [crow, ccol]  
    x, y = np.ogrid[:rows, :cols]  
    mask_area_lowpass = (x - center[0]) ** 2 + (y - center[1]) ** 2 <= r*r  
    mask_lowpass[mask_area_lowpass] = 1  
    mask_highpass[mask_area_lowpass] = 0  
      
    # 应用滤波器并进行逆DFT  
    fshift_lowpass = dft_shift * mask_lowpass  
    fshift_highpass = dft_shift * mask_highpass  
    f_ishift_lowpass = np.fft.ifftshift(fshift_lowpass)  
    f_ishift_highpass = np.fft.ifftshift(fshift_highpass)  
    img_back_lowpass = cv2.idft(f_ishift_lowpass)  
    img_back_highpass = cv2.idft(f_ishift_highpass)  
    img_back_lowpass = cv2.magnitude(img_back_lowpass[:, :, 0], img_back_lowpass[:, :, 1])  
    img_back_highpass = cv2.magnitude(img_back_highpass[:, :, 0], img_back_highpass[:, :, 1])  
      
    # 归一化到0-255并保存结果  
    img_back_lowpass = cv2.normalize(img_back_lowpass, None, alpha=0, beta=255, norm_type=cv2.NORM_MINMAX, dtype=cv2.CV_8UC1)  
    img_back_highpass = cv2.normalize(img_back_highpass, None, alpha=0, beta=255, norm_type=cv2.NORM_MINMAX, dtype=cv2.CV_8UC1)  
      
    # 保存图像  
    cv2.imwrite(output_path_lowpass, img_back_lowpass)  
    cv2.imwrite(output_path_highpass, img_back_highpass)  
      
    # 显示图像(可选)  
    plt.subplot(131), plt.imshow(img, cmap='gray'), plt.title('Input Image')  
    plt.subplot(132), plt.imshow(img_back_lowpass, cmap='gray'), plt.title('Lowpass Filter')  
    plt.subplot(133), plt.imshow(img_back_highpass, cmap='gray'), plt.title('Highpass Filter')  
    plt.show()  
  
# 使用示例:  
image_path = 'path_to_your_image.jpg'  # 请替换为你的图像文件路径  
output_path_lowpass = 'output_lowpass.jpg'  # 低通滤波后的输出文件路径  
output_path_highpass = 'output_highpass.jpg'  # 高通滤波后的输出文件路径  
d0 = 60  # 滤波器的直径,可根据需要调整  
fourier_filter(image_path, output_path_lowpass, output_path_highpass, d0)

直线检测

# 将彩色图片灰度化
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
gray = cv2.GaussianBlur(gray,(11, 11), 0)
# 进行Hough_line直线检测
lines = cv2.HoughLines(edges, 1, np.pi / 180, 240)
print(len(lines))
print(lines)

在这里插入图片描述

直线的绘制

# 遍历每一个r和theta
for i in range(len(lines)):
    r, theta = lines[i, 0, 0], lines[i, 0, 1]
    a = np.cos(theta)  # cos(theta)
    b = np.sin(theta)  # sin(theta)
    x0 = a * r  # rcos(theta)
    y0 = b * r  # rsin(theta)
    x1 = int(x0 + 1000 * (-b))  # rcos(theta)-1000sin(theta)
    y1 = int(y0 + 1000 * (a))  # rsin(theta)+1000cos(theta)
    x2 = int(x0 - 1000 * (-b))  # rcos(theta)+1000sin(theta)
    y2 = int(y0 - 1000 * (a))  # rsin(theta)-1000cos(theta)
    cv2.line(img, (x1, y1), (x2, y2), (0, 255, 0), 1)  # 绘制直线结果

相机标定

**相机标定的主要作用和目的是为了提高机器视觉系统在三维测量和识别中的应用精度。**具体来说,相机标定可以解决以下问题:

  1. 被测平面不确定性:在实际应用中,被测平面的位置可能无法精确控制,而且镜头也不是理想的小孔模型,因此无法直接使用简单的公式计算实际距离。
  2. 镜头畸变:镜头可能存在畸变,这会影响图像的正确性,使得无法直接使用小孔成像模型来计算距离。
  3. 非理想坐标平面转换:在三维空间中,需要将任意坐标平面转换到理想坐标平面上,并对有畸变的图像进行校正,以便进行后续的尺寸和位置测量。

通过相机标定,可以确定相机的内参和外参,包括镜头的焦距、畸变参数、光轴中心坐标和像元尺寸等。这些参数是唯一确定的,当摄像机和镜头确定时。通过这些参数的转换和校正,可以实现对三维空间中任意平面上尺寸与位置的测量,从而提高机器视觉系统的测量和定位精度。

# 相机标定
retval, cameraMatrix, distCoeffs, rvecs, tvecs = cv2.calibrateCamera(objectPoints, imagePoints, imageSize)

参数

retval:标定误差

cameraMatrix: 内在相机矩阵

distCoeffs: 镜头畸变系数。

rvecs: 为 3×1 旋转向量。向量的方向指定旋转轴,向量的大小指定旋转角度。

tvecs: 3×1 平移向量。

校准因素

import cv2
import numpy as np
import glob


def main():
    # 参数设置
    criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)
    w, h = 11, 8  # 棋盘格内角点数量(亲自数)
    objp = np.zeros((w * h, 3), np.float32)
    objp[:, :2] = np.mgrid[0:w, 0:h].T.reshape(-1, 2)

    # 存储角点信息
    objpoints = []  # 三维世界坐标
    imgpoints = []  # 二维图像坐标

    # 加载并处理图像
    images = glob.glob('data/d2/*.jpg')
    for fname in images:
        img = cv2.imread(fname)
        # img = cv2.resize(img, (768, 1024))  # 统一图像大小
        gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
        # gray = cv2.GaussianBlur(gray, (11, 11), 0)  # 滤波处理

        # 寻找棋盘格角点
        ret, corners = cv2.findChessboardCorners(gray, (w, h), None)

        if ret:
            corners = cv2.cornerSubPix(gray, corners, (11, 11), (-1, -1), criteria)  # 亚像素级角点检测
            m = [c[0] for c in corners]
            pass

            objpoints.append(objp)
            imgpoints.append(corners)

            # 可视化和保存结果
            cv2.drawChessboardCorners(img, (w, h), corners, True)
            cv2.imshow('Corners Found', img)
            cv2.waitKey(100)
            # 根据需要保存图像,这里以序号命名
            cv2.imwrite(f"result/mm_{len(imgpoints)}.jpg", img)
        else:
            print(f"Calibration failed for image: {fname}")

    cv2.destroyAllWindows()

    # 相机标定
    ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, (768, 1024), None, None)

    # 输出标定结果
    print("Calibration Error:", ret)
    print("Intrinsic Matrix:\n", mtx)
    print("Distortion Coefficients:\n", dist.ravel())
    # 如果需要,可以保存或进一步处理旋转向量和平移向量
    # print("Rotation Vectors:\n", rvecs)
    # print("Translation Vectors:\n", tvecs)


if __name__ == '__main__':
    main()

视频处理

视频格式

code ={"mp4":"mp4v","avi":"I420","flv":"FLV1"}


cv2.VideoWriter_fourcc('I','4','2','0') 
# 这个选项是一个未压缩的YUV编码,4:2:0色度子采样。这种编码广泛兼容,但会产生大文件。文件扩展名应为.avi。

cv2.VideoWriter_fourcc('P','I','M','1')
# 此选项为MPEG-1。文件扩展名应为.avi。

cv2.VideoWriter_fourcc('X','V','I','D') 
# 此选项是一个相对较旧的MPEG-4编码。如果要限制结果视频的大小,这是一个很好的选择。文件扩展名应为.avi。

cv2.VideoWriter_fourcc('M','J','P','G')
# 此选项为motion-jpeg视频。文件扩展名应为.avi。

cv2.VideoWriter_fourcc('X','2','6','4'):
# 这个选项是一种比较新的MPEG-4编码方式。如果你想限制结果视频的大小,这可能是最好的选择。文件扩展名应为.mp4。

cv2.VideoWriter_fourcc('H','2','6','4'):
# 这个选项是传统的H264编码方式。如果你想限制结果视频的大小,这可能是很好的选择。文件扩展名应为.mp4。

cv2.VideoWriter_fourcc('m', 'p', '4', 'v') 
# 此选项是另一个相对较旧的MPEG-4编码。如果要限制结果视频的大小,这是一个很好的选择。文件扩展名应为.m4v。

cv2.VideoWriter_fourcc('T','H','E','O') 
# 这个选项是Ogg Vorbis。文件扩展名应为.ogv。

cv2.VideoWriter_fourcc('F','L','V','1')
# 此选项为Flash视频。文件扩展名应为.flv。

模板

摄像头处理(带参调节)

import cv2
import traceback

def callback(value):
    print(value)


def detect(img, k_size, min_val, max_val):
    return img

if __name__ == '__main__':
    h = BaslerCam(szSettingFile='xxx.pfs', szName='Test_use_01')
    cv2.namedWindow("img")
    cv2.resizeWindow("img", (1024, 768))
    cv2.createTrackbar("k_size", "img", 10, 90, callback)
    cv2.createTrackbar("c_minval", "img", 10, 90, callback)
    cv2.createTrackbar("c_maxval", "img", 10, 90, callback)
    base_size = 10
    base_minval = 10
    base_maxval = 10
    while True:
        b, hFrames = h.ReadFrames(1)
        try:
            if len(hFrames) == 0:
                continue
            p = hFrames[0]
            try:
                k_size = cv2.getTrackbarPos("k_size", "img")
                k_size = k_size if k_size % 2 == 1 else k_size + 1
                c_minval = cv2.getTrackbarPos("c_minval", "img")
                c_maxval = cv2.getTrackbarPos("c_maxval", "img")

                result = detect(p.copy(), (base_size + k_size, base_size + k_size), base_minval + c_minval,base_maxval + c_maxval)  # 保存结果
                if result is not None:
                    cv2.imshow("img", cv2.resize(result, (1024, 768)))
                    cv2.waitKey(1)
            except Exception as e:
                traceback.print_exc()
        except Exception as e:
            print(e)
            traceback.print_exc()

单图片处理(带参调节)

import cv2
import traceback

def callback(value):
    print(value)


def detect(img, k_size, min_val, max_val):
    return img


if __name__ == '__main__':
    img_path = "../data/result/img/1712817408432.jpg"

    # 读取输入图片data/resource/img/led/1711702476703.jpg
    img = cv2.imread(img_path)
    img = cv2.resize(img, (1024, 768))
    cv2.namedWindow("img")
    cv2.resizeWindow("img", (1024, 768))
    cv2.createTrackbar("k_size", "img", 10, 90, callback)
    cv2.createTrackbar("c_minval", "img", 10, 90, callback)
    cv2.createTrackbar("c_maxval", "img", 10, 90, callback)
    base_size = 10
    base_minval = 10
    base_maxval = 10
    while True:
        try:
            k_size = cv2.getTrackbarPos("k_size", "img")
            k_size = k_size if k_size % 2 == 1 else k_size + 1
            c_minval = cv2.getTrackbarPos("c_minval", "img")
            c_maxval = cv2.getTrackbarPos("c_maxval", "img")

            result = detect(img.copy(), (base_size + k_size, base_size + k_size), base_minval + c_minval,
                            base_maxval + c_maxval)
            # 保存结果
            # file_name = img_path.split("/")[-1]
            # print(file_name)
            # cv2.imwrite(f"../data/result/img/r_{file_name}", result)
            if result is not None:
                cv2.imshow("img", result)
                cv2.waitKey(1)
        except Exception as e:
            print(e)
            traceback.print_exc()

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JAVA上门家政服务系统源码微信小程序+微信公众号+APP+H5

&#x1f3e0;家政服务系统&#xff1a;一键预约&#xff0c;轻松享受家居生活&#x1f389; 功能介绍 用户端&#xff1a;精准分类、支持家政、维修、万能服务、一口价、报价、线上、各类家政服务、优惠专区、师傅入驻、商家入驻、我的需求、补费明细、我的投诉 师傅端&…

基于Spring Boot+VUE旧物置换网站

1前台首页功能模块 旧物置换网站&#xff0c;在系统首页可以查看首页、旧物信息、网站公告、个人中心、后台管理等内容&#xff0c;如图1所示。 图1系统功能界面图 用户注册&#xff0c;在用户注册页面通过填写用户名、密码、姓名、性别、头像、手机、邮箱等内容进行用户注册&…

Linux 系统图像化编程GTK入门

环境前期准备 演示环境&#xff1a;Windows 11 Ubuntu 22.04.4 VS Code 前提条件&#xff1a;1、Windows 11 子系统Ubuntu 22.04.4 已经安装图形化界面&#xff0c;如果没有安装请参考文章&#xff1a; windows11子系统Ubuntu 22.04.4子安装图形化界面 2、Ubuntu 22.04.4…

小程序餐饮点餐系统,扫码下单点菜,消费端+配送端+收银端+理端

目录 前言&#xff1a; 一、小程序功能有哪些 前端&#xff1a; 管理端&#xff1a; 二、实体店做小程序的好处 方便快捷的点餐和支付体验&#xff1a; 扩大店铺的曝光度和影响力&#xff1a; 优化顾客体验和服务质量&#xff1a; 降低成本和提高效率&#xff1a; 数据…

iview 组件里面的(任何一个月)整月日期全部选中_iview时间轴选中有历史记录日期

iview 组件里面的整月日期全部选中&#xff1a; ①&#xff1a;第一种是当前月的日期全部选中&#xff1a; 先上效果图&#xff1a;当前月分 获取到的值&#xff1a; 当前月的方法&#xff1a; // getDateStr() {// var curDate new Date();// var curMonth curDate.ge…

K8s的资源对象

资源对象是 K8s 提供的一些管理和运行应用容器的各种对象和组件。 Pod 资源是 K8s 中的基本部署单元&#xff0c;K8s通过Pod来运行业务应用的容器镜像 Job 和 CronJob 资源用于执行任务和定时任务&#xff0c;DaemonSet 资源提供类似每个节点上守护进程&#xff0c; Deployment…

WPF 深入理解四、样式

样式 WPF中的各类控件元素,都可以自由的设置其样式。 诸如: 字体(FontFamily) 字体大小(FontSize) 背景颜色(Background) 字体颜色(Foreground) 边距(Margin) 水平位置(HorizontalAlignment) 垂直位置(VerticalAlignment)等等。 而样式则是组织和重用以上的重要工具。不是使…

Nginx缓存之web缓存配置

Web 缓存可节约网络带宽&#xff0c;有效提高用户打开网站的速度。由于应用服务器被请求次数的降低&#xff0c;也相对使它的稳定性得到了提升。Web 缓存从数据内容传输的方向分为前向位置缓存和反向位置缓存两类。如下图所示。 前向位置缓存既可以是用户的客户端浏览器&#x…

iOS 18 Siri 升级之后都有哪些改变?

新界面 首先最显著的改变就是 Siri 的界面不同了&#xff0c;之前的界面是在打开 Siri 之后会出现一个圆形图案&#xff0c;而在 Siri 升级之后变成了屏幕边缘发出亮光。 来源&#xff1a;Apple 可在任意位置使用 苹果的生成式人工智能 Apple Intelligence 将为 Siri 提供支…

【前端】 nvm安装管理多版本node、 npm install失败解决方式

【问题】If you believe this might be a permissions issue, please double-check the npm ERR! permissio或者Error: EPERM: operation not permitted, VScode中npm install或cnpm install报错 简单总结&#xff0c;我们运行npm install 无法安装吧包&#xff0c;提示权限问题…

pdf怎么压缩到2m以内或5m以内的方法

PDF作为一种广泛使用的文档格式&#xff0c;已经成为我们工作和生活中不可或缺的一部分。然而&#xff0c;有时候PDF文件内存会比较大&#xff0c;给我们的存储和传输带来了很大的不便。因此&#xff0c;学会压缩 PDF 文件是非常必要的。 打开"轻云处理pdf官网"&…

JAVA二手车交易二手车市场系统源码支持微信小程序+微信公众号+H5+APP

&#x1f697;二手车交易系统小程序&#xff1a;让买卖更轻松&#x1f50d; 功能介绍 我的粉丝、我的关注、获赞、访客 我的动态、认证中心、我的团队、开通会员 免费估值、买二手车、我要卖车、车型选择 每日上新、底价专区、精准筛选、附近展厅商 车辆的详细信息、拨打电…

Mamba: Linear-Time Sequence Modeling with Selective State Spaces论文笔记

文章目录 Mamba: Linear-Time Sequence Modeling with Selective State Spaces摘要引言 相关工作(SSMs)离散化计算线性时间不变性(LTI)结构和尺寸一般状态空间模型SSMs架构S4(补充)离散数据的连续化: 基于零阶保持技术做连续化并采样循环结构表示: 方便快速推理卷积结构表示: 方…

从0开始开发一个简单web界面的学习笔记(HTML类)

文章目录 什么是HTML页面vscode 开放工具搭建第一个HTML页面编写vscode 如何快速生成代码框架html标签——注释、标题、段落、换行标签格式化标签img 标签(src 属性01)img 属性02(alt、title、width/height、border)a标签href属性a标签target属性表格标签01 基本属性表格标签02…

镜头跟踪的两种方法

方法一 (1) 原理&#xff1a;使球与摄像机保持固定的角度和距离 (2) 给Main Camera添加CamraCtrller.cs组件 public Transform Player;//小球的Transformprivate Vector3 offset;//小球与摄像机位置的偏移&#xff08;在三轴上的距离&#xff09;void Start(){offset Playe…

【LinkedList与链表】

目录 1&#xff0c;ArrayList的缺陷 2&#xff0c;链表 2.1 链表的概念及结构 2.2 链表的实现 2.2.1 无头单向非循环链表实现 3&#xff0c;LinkedList的模拟实现 3.1 无头双向链表实现 4&#xff0c;LinkedList的使用 4.1 什么是LinkedList 4.2 LinkedList的使用 5…

next.js v14 升级全步骤|迁移 pages Router 到 App Router

【概括】本文升级整体按照官网文档指引进行&#xff0c;在迁移 pages Router 前先看了官网的实操视频。 【注意】文章内对 .babel.ts、next.config.js 进行了多次更改&#xff0c;最终配置可见 报错3: Server Error ReferenceError: React is not defined 一、升级 Next.js 版…

基于Spark3.3.4版本,实现Standalone 模式高可用集群部署

目录 一、环境描述 二、部署Spark 节点 2.1 下载资源包 2.2 解压 2.3 配置 2.3.1 配置环境变量 2.3.2 修改workers配置文件 2.3.3 修改spark.env.sh文件 2.3.4 修改spark-defaults.conf 2.4 分发 2.5 启动服务 2.5.1 启动zookeeper 2.5.2 启动hdfs 2.5.3 启动spar…

20240611-WWDC2024-visionOS 2/Apple Intelligence/ARKit

目录 1 visionOS 2 1&#xff09;从2D图像提取左右眼的视角&#xff0c;生成空间照片——利用机器学习 2&#xff09;提供丰富的API和框架 2 Apple Intelligence 1&#xff09;自动对通知优先级排序、缩略通知、专注模式 2&#xff09;Siri可以根据屏幕内容执行相关操作 …

使用海康威视的SDK,利用WPF设计一个网络摄像头的显示控制程序(上位机)

目录 一、下载海康威视的SDK 1.1 关于SDK 1.2 关于API 1.3 关于DLL 1.4 下载海康威视的SDK 1.5 关于网络高清摄像机 二、对下载的SDK进行调试 三、利用Visual Studio打开项目的解决方案 3.1 Visual Studio 2022下载 3.2 关于句柄 四、打开WPF进行ui页面设计 4.1 关于…