opencv-python(十)

news2024/12/28 20:25:24

绘制直线

cv2.line(img, pt1, pt2, color, thickness=1, lineType=LINE_8)

上述代码可以从pt1点绘一条线到pt2点。

 img:绘图对象

pt1:线段的起点,画布的左上角坐标是(0, 0)

pt2:线段的终端

color:(B,G,R),所以(255,0,0)是蓝色

thickness:线条宽度,默认是1

lineType:可选参数,指线条样式,有LINE_4、LINE_8和LINE_AA可选,默认是LINE_8

import cv2
import numpy as np

img = np.ones((350,500,3),np.uint8)*255  # 建立白色底的画布
cv2.line(img,(1,1),(300,1),(255,0,0))  # 上方水平直线
cv2.line(img,(300,1),(300,300),(255,0,0))  # 右边垂直直线
cv2.line(img,(300,300),(1,300),(255,0,0))  # 下边水平直线
cv2.line(img,(1,300),(1,1),(255,0,0))  # 左边垂直直线
cv2.imshow("My Draw",img)

cv2.waitKey(0)
cv2.destroyAllWindows()

import cv2
import numpy as np

img = np.ones((350,500,3),np.uint8)*255
img[1:300,1:300] = (0,255,255)  # 设定黄色底

cv2.line(img, (1,1), (300,1),(255,0,0))
cv2.line(img,(300,1),(300,300),(255,0,0))
cv2.line(img,(300,300),(1,300),(255,0,0))
cv2.line(img,(1,300),(1,1),(255,0,0))
for x in range(150,300,10):
    cv2.line(img,(x,1),(300,x-150),(255,0,0))
for y in range(150,300,10):
    cv2.line(img,(1,y),(y-150,300),(255,0,0))

cv2.imshow('My Draw', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

绘制矩形

import cv2
import numpy as np

img = np.ones((350,500,3),np.uint8)*255
cv2.rectangle(img,(1,1),(300,300),(255,0,0)) # 绘制矩形
for x in range(150,300,10):
    cv2.line(img,(x,1),(300,x-150),(255,0,0))
for y in range(150,300,10):
    cv2.line(img,(1,y),(y-150,300),(255,0,0))
cv2.imshow("My Draw",img)
cv2.waitKey(0)
cv2.destroyAllWindows()

cv2.rectangle(img, pt1, pt2, color, thickness=1, lineType=LINE_8)

img:绘图对象

pt1:矩形的左上角坐标,数据格式是元组(x,y)

pt2:矩形的右下角坐标,数据格式是元组(x,y)

color:(B,G,R)方式处理色彩

thickness:线条宽度,默认是1.如果宽度设为-1,则建立实心矩形

lineType:可选参数,指线条样式,有LINE_4、LINE_8和LINE_AA可选,默认是LINE_8

import cv2
import numpy as np

img = np.ones((350,500,3),np.uint8)*255
cv2.rectangle(img,(1,1),(300,300),(0,255,255),-1) # 设定黄色底
cv2.rectangle(img,(1,1),(300,300),(255,0,0))  # 绘制矩形
for x in range(150,300,10):
    cv2.line(img,(x,1),(300,x-150),(255,0,0))
for y in range(150,300,10):
    cv2.line(img,(1,y),(y-150,300),(255,0,0))
cv2.imshow("My Draw",img)
cv2.waitKey(0)
cv2.destroyAllWindows()

绘制圆形

import cv2
import  numpy as np

height = 400
width = 600
img = np.zeros((height,width,3),np.uint8)
for i in range(0,50):
    cx = np.random.randint(0,width)
    cy = np.random.randint(0,height)
    color = np.random.randint(0,256,size=3).tolist()  # tolist()函数可以将数组改为列表
    r = np.random.randint(5, 100)
    cv2.circle(img,(cx,cy),r,color,-1)
cv2.imshow("Random Circle",img)
cv2.waitKey(0)
cv2.destroyAllWindows()

cv2.circle(img, center, radius, color, thickness=1, lineType=LINE_ 8 )

center:设定圆中心坐标,数据格式是元组(x,y)

radius:设定半径

color:(B,G,R)

thickness:线条宽度,默认是1,如果宽度设为-1,则建立实心圆形

lineType:可选参数,指线条样式,有LINE_4、LINE_8和LINE_AA可选,默认是LINE_8

绘制椭圆或椭圆弧

cv2.ellipse(img, center, axes, angle, startAngle, endAngle, color, thickness=1, lineType=LINE_ 8 )

axes:轴的长度

angle:椭圆偏移的角度

startAngle:圆弧起点的角度

endAngle:圆弧终点的角度

import cv2
import numpy as np

img = cv2.imread('antarctic.jpg')
cy = img.shape[0] // 2  # 中心点y的坐标
cx = img.shape[1] // 2  # 中心点x的坐标
size = (200,120)
for i in range(0,15):
    angle = np.random.randint(0,361)
    color = np.random.randint(0,256,size=3).tolist()
    cv2.ellipse(img,(cx,cy),size,angle,0,360,color,1)

cv2.imshow('My Draw',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

绘制多边形

cv2.polylines(img,pts,isClosed,color,thickness=1,lineType=LINE_8)

pts:Numpy数组,内含多边形顶点的坐标

isClosed:如果是True则建立封闭式多边形,也就是第一个点和最后一个点会连接。如果是False则建立开放式多边形,也就是第一个点和最后一个点不会连接。

import cv2
import numpy as np

img1 = np.ones((200,300,3),np.uint8)*255
pts = np.array([[50,50],[250,50],[200,150],[100,150]])
cv2.polylines(img1,[pts],True,(255,0,0),5)

img2 = np.ones((200,300,3),np.uint8)*255
cv2.polylines(img2,[pts],False,(0,0,255),3)

cv2.imshow('isClosed_Ture',img1)
cv2.imshow('isClosed_False',img2)
cv2.waitKey(0)
cv2.destroyAllWindows()

输出文字

 cv2.putText(img, text,org, fontFace,fontScale,color,thickness=1,lineType=LINE_8,bottomLeftOrigin=False)

text:要输出的文字

org:文字位置,是指第一个文字左下方的坐标(x,y)

fontFace:文字的字体样式,常见字体样式如下

FONT_HERSHEY_SIMPLEX:sans-serif字型,正常大小

FONT_HERSHEY_PLAIN:sans-serif字型,较小字型

FONT_HERSHEY_COMPLEX:sans字型,正常字型

FONT_HERSHEY_TRIPLEX:sans字型,较小字型

FONT_HERSHEY_SCRIPT_SIMPLEX:手写风格的字型

FONT_ITALIC:italic字型(斜体字)

frontScale:文字的字体大小

bottomLeftOrigin:默认是False,当设为True时,可以有垂直倒影的效果。

import cv2
import numpy as np

img = np.ones((300,600,3),np.uint8)*255
font = cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(img,'Python',(150,180),font,3,(255,0,0),12)
cv2.putText(img,"Python",(150,180),font,3,(0,255,255),5)

cv2.imshow("Python",img)
cv2.waitKey(0)
cv2.destroyAllWindows()

中文输出

opencv默认只支持英文,不过可以使用PIL模块,设置成可以输出中文,

1.将opencv的图像格式转换成PIL图像格式

2.使用PIL格式输出中文

3.将PIL的图像格式转换成Opencv图像格式

import cv2
import numpy as np
from PIL import Image,ImageDraw,ImageFont

def cv2_Chinese_Text(img,text,left,top,textColor,fontSize):
    if(isinstance(img,np.ndarray)):
        img = Image.fromarray(cv2.cvtColor(img,cv2.COLOR_BGR2RGB))
    draw = ImageDraw.Draw(img)
    fontText = ImageFont.truetype(
        r"C:\Users\System-Pc\Desktop\simsun.ttc",
        fontSize,
        encoding="utf-8"
    )
    draw.text((left,top),text,textColor,font=fontText)
    return cv2.cvtColor(np.asarray(img),cv2.COLOR_RGB2BGR)

img = cv2.imread("antarctic.jpg")
img = cv2_Chinese_Text(img, "我在南极",220,100,(0,0,255),50)
cv2.imshow("Antarctic",img)
cv2.waitKey(0)
cv2.destroyAllWindows()

反弹球的设计

(1)选定位置显示反弹球

(2)让反弹球显示一段时间

(3)在新位置显示反弹球

(4)回到步骤(2)

import time

time.sleep(speed)   # 单位是秒

import cv2
import numpy as np
import time
from random import *

width = 640
height = 480
r = 15
speed = 0.01
x = int(width/2)-r
y = 50
y_step = 5
while cv2.waitKey(1) == -1:
    if y > height - r or y<r:  # 反弹球超出画布下边界或者上边界
        y_step = -y_step
    y += y_step
    img = np.zeros((height,width,3),np.uint8)*255
    cv2.circle(img,(x,y),r,(255,0,0),-1)
    cv2.imshow("Bouncing Ball",img)
    time.sleep(speed)

cv2.destroyAllWindows()

上述反弹球是垂直移动,可以使用y_step设定移动步伐,如果y_step是正值则球往下方移动,如果y_step是负值则球往上移动。

import  cv2
import numpy as np
import time
from random import *

width = 640
height = 480
r = 15
speed = 0.01
x = 50
y = 50
random_step = [3,4,5,6,7]
shuffle(random_step)
x_step = random_step[0]  # 随机产生x步伐
y_step = 5
while cv2.waitKey(1) == -1:
    if x >width -r or x<r:
        x_step = -x_step
    if y>height-r or y<r:
        y_step = -y_step
    x+=x_step
    y+=y_step
    img = np.ones((height,width,3),np.uint8)*255
    cv2.circle(img,(x,y),r,(255,0,0),-1)
    cv2.imshow("Bouncing Ball",img)
    time.sleep(speed)

cv2.destroyAllWindows()

 鼠标事件

OnMouseAction(event, x, y, flags, param)

event:鼠标事件名称

EVENT_MOUSEMOVE:0,移动鼠标

EVENT_LBUTTONDOWN:1,单击

EVENT_RBUTTONDOWN:2,右击

EVENT_MBUTTONDOWN:3,单击鼠标中间键

EVENT_LBUTTONUP:4,放开鼠标左键

EVENT_RBUTTONUP:5,放开鼠标右键

EVENT_MBUTTONUP:6,放开鼠标中键

EVENT_LBUTTONBCLK:7,双击

EVENT_RBUTTONBCLK:8,双击鼠标右键

EVENT_MBUTTONBCLK:9,双击鼠标中间键

x,y:鼠标事件发生时,鼠标所在x轴,y轴坐标

flag:代表鼠标拖曳事件,或是键盘与鼠标综合事件

EVENT_FLAG_LBUTTON:1,按住左键拖曳

EVENT_FLAG_RBUTTON:2,按住右键拖曳

EVENT_FLAG_MBUTTON:4,按住中间键拖曳

EVENT_FLAG_CTRLKEY:8~15,按住ctrl键不放

EVENT_FLAG_SHIFTKEY:16~31,按住Shift键不放

EVENT_FLAG_ALTKEY:32~39,按住Alt键不放

param:标记函数ID

import cv2
import numpy as np
def OnMouseAction(event,x,y,flags,param):
    if event == cv2.EVENT_LBUTTONDOWN:
        print(f"在x={x},y={y},单击")
    elif event == cv2.EVENT_RBUTTONDOWN:
        print(f"在x={x},y={y},右击")
    elif event == cv2.EVENT_MBUTTONDOWN:
        print(f"在x={x},y={y},单击鼠标中间键")
    elif flags == cv2.EVENT_FLAG_LBUTTON:
        print(f"在x={x},y={y},按住鼠标左键拖曳")
    elif flags == cv2.EVENT_FLAG_RBUTTON:
        print(f"在x={x},y={y},按住鼠标右键拖曳")

image = np.ones((200,300,3),np.uint8)*255
cv2.namedWindow('Opencv Mouse Event')
cv2.setMouseCallback("Opencv Mouse Event",OnMouseAction)
cv2.imshow('Opencv Mouse Event',image)

cv2.waitKey(0)
cv2.destroyAllWindows()

cv2.setMouseAction('image', OnMouseAction)

image:窗口名称

OnMouseAction:

单击可以在鼠标光标位置建立实心圆,圆半径10~50随机产生,色彩也随即生成。右击可以建立线条宽度为3的随机空心圆,英文模式下,按下Q键可以结束程序。

import cv2
import numpy as np

def OnMouseAction(event, x, y, flag, param):
    color = np.random.randint(0,high=256,size=3).tolist()
    r = np.random.randint(10,50)
    if event == cv2.EVENT_LBUTTONDOWN:
        cv2.circle(image, (x,y), r, color,-1)
    elif event == cv2.EVENT_RBUTTONDOWN:
        cv2.circle(image, (x,y),r,color,3)

height = 400
width = 600
image = np.ones((height,width,3),np.uint8)*255
cv2.namedWindow('Draw Circle')
cv2.setMouseCallback('Draw Circle', OnMouseAction)
while 1:
    cv2.imshow('Draw Circle', image)
    key = cv2.waitKey(100)  # 0.1秒检查一次
    if key == ord('Q') or key == ord('q'):
        break

cv2.destroyAllWindows()

如果按住键盘S键,再单击可以建立实心圆;如果没有按键盘S键,可以产生空心圆。

如果按住键盘S键,再右击可以建立实心矩形;如果没有按键盘S键,可以产生空心矩形。

在英文输入模式下,按下Q键可以结束程序。

import cv2
import numpy  as np

def OnMouseAction(event, x,y,flags,param):
    color = np.random.randint(0,high=256,size=3).tolist()
    if event == cv2.EVENT_LBUTTONDOWN:
        r = np.random.randint(10,50)
        if key == ord('s'):
            cv2.circle(image, (x,y),r,color,-1)
        else:
            cv2.circle(image,(x,y),r,color,3)
    elif event == cv2.EVENT_RBUTTONDOWN:
        px = np.random.randint(10,100)
        py = np.random.randint(10,100)
        if key == ord('s'):
            cv2.rectangle(image,(x,y),(px,py),color,-1)
        else:
            cv2.rectangle(image,(x,y),(px,py),color,3)

height = 400
width = 600
image = np.ones((height,width,3),np.uint8)*255
cv2.namedWindow("MyDraw")
cv2.setMouseCallback("MyDraw",OnMouseAction)
while 1:
    cv2.imshow("MyDraw",image)
    key = cv2.waitKey(100)
    if key == ord('Q') or key == ord('q'):
        break
cv2.destroyAllWindows()

滚动条

cv2.createTrackbar(trackbarname, winname, value, count, onChange)

trackbarname:滚动条的名称

winname:窗口名称

value:滚动条的初值

count:滚动条的最大值

onChange:回调函数,将滚动条所要执行的操作写在此处

程序执行过程中用户可以操作滚动条,OpenCv提供了getTrackbarPos()函数,可以使用它获得滚动条的目前值

code = getTrackbarPos(trackername, winname)

trackername:滚动条名称

winname:窗口名称

import cv2
import numpy as np
def onChange(x):
    b = cv2.getTrackbarPos("B",'canvas')
    g = cv2.getTrackbarPos("G",'canvas')
    r = cv2.getTrackbarPos("R",'canvas')
    canvas[:]=[b,g,r]

canvas = np.ones((200,640,3),np.uint8)*255
cv2.namedWindow("canvas")
cv2.createTrackbar("B",'canvas',0,255,onChange)
cv2.createTrackbar("G",'canvas',0,255,onChange)
cv2.createTrackbar("R",'canvas',0,255,onChange)
while 1:
    cv2.imshow('canvas',canvas)
    key = cv2.waitKey(100)
    if key ==27:   # 按Esc键结束
        break
cv2.destroyAllWindows()

滚动条当作开关

将滚动条当作开关的应用,默认开关是0,这时单击可以绘制空心圆。

单击滚动条轨迹可以将开关设为1,这时单击可以绘制实心圆。按Q键则程序结束。

import cv2
import numpy as np

def onChange(x):
    pass

def OnMouseAction(event,x,y,flags,param):
    color = np.random.randint(0,high=256,size=3).tolist()
    r = np.random.randint(10,50)
    if event == cv2.EVENT_LBUTTONDOWN:
        cv2.circle(image,(x,y),r,color,thickness)

thickness = -1
height =400
width = 600
image = np.ones((height,width,3),np.uint8)*255
cv2.namedWindow("Draw Circle")
cv2.setMouseCallback("Draw Circle",OnMouseAction)
cv2.createTrackbar('Thickness','Draw Circle',0,1,onChange)
while 1:
    cv2.imshow('Draw Circle',image)
    key = cv2.waitKey(100)
    num = cv2.getTrackbarPos('Thickness','Draw Circle')
    if num == 0:
        thickness = -1
    else:
        thickness = 3
    if key == ord('Q') or key == ord('q'):
        break
cv2.destroyAllWindows()

 

 

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

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

相关文章

记录一次root过程

设备: Redmi k40s 第一步&#xff0c; 解锁BL&#xff08;会重置手机系统&#xff01;&#xff01;&#xff01;所有数据都会没有&#xff01;&#xff01;&#xff01;&#xff09; 由于更新了澎湃OS系统, 解锁BL很麻烦, 需要社区5级以上还要答题。 但是&#xff0c;这个手机…

React+TS前台项目实战(十)-- 全局常用组件CopyText封装

文章目录 前言CopyText组件1. 功能分析2. 代码详细注释3. 使用方式4. 效果展示 总结 前言 今天这篇主要讲项目常用复制文本组件封装&#xff0c;这个组件是一个用于拷贝文本的 React 组件&#xff0c;它提供了拷贝&#xff0c;国际化和消息提示的功能 CopyText组件 1. 功能分…

C++11完美转发(引用折叠、万能引用)

完美转发是指在函数模板中&#xff0c;完全依照模板的参数的类型&#xff0c;将参数传递给函数模板中调用的另外一个函数。 函数模板在向其他函数传递自身形参时&#xff0c;如果相应实参是左值&#xff0c;它就应该被转发为左值&#xff1b;如果相 应实参是右值&#xff0c;它…

创建vite工程,使用框架为Vanilla时,语言是typescript,修改http端口的方法

直接在项目根目录创建 vite.config.ts文件。 在该文件中添加内容&#xff1a; import { defineConfig } from vite;export default defineConfig({server: {port: 7777,}, });最后尝试运行package.json中的Debug

Codeforces Round 953 (Div. 2) A - C 题解

因为有事只做了A-C&#xff0c;都比较简单&#xff0c;全是很简单的思维&#xff0c;明天有空还会添加上D&#xff0c;如果有人需要可以明天常来看看&#xff01; 进入正题&#xff1a; A. Alice and Books 题意&#xff1a;给你n个数字&#xff0c;将这些数字分到两堆里&am…

PD19 Parallels Desktop 虚拟机 安装Windows10系统 操作步骤(保姆级教程,轻松上手)

Mac分享吧 文章目录 效果一、准备工作二、开始安装1、打开pd 19 虚拟机&#xff0c;点击右上角文件&#xff0c;新建2、通过下载好的镜像安装Windows10系统。找到镜像文件位置&#xff0c;安装&#xff0c;配置2、显示安装完成&#xff0c;打开Windows10系统 三、运行测试1、打…

60.WEB渗透测试-信息收集- 端口、目录扫描、源码泄露(8)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;59.WEB渗透测试-信息收集- 端口、目录扫描、源码泄露&#xff08;7&#xff09; 御剑是用…

中小企业使用CRM系统的优势有哪些

中小企业如何在竞争激烈的市场中脱颖而出&#xff1f;除了优秀的产品和服务&#xff0c;一个高效的管理工具也是必不可少的。而客户关系管理&#xff08;CRM&#xff09;系统正是这样一个能帮助企业提升客户体验、优化内部管理流程的重要工具。接下来&#xff0c;让我们一起探讨…

【Python网络爬虫分步走】使用LXML解析网页数据

Python网络爬虫分步走 – 使用LXML解析网页数据 Web Scraping in Python - Using LXML to Parse Web Data By Jackson@ML Lxml作为Python的第三方库,提供易用的且功能强大的API,用来解析XML和HTML文档。事件驱动的API被用于分步骤解析。 本文简要介绍使用lxml库解析网页的基…

TF-IDF在现代搜索引擎优化策略中的作用

TF-IDF&#xff08;Term Frequency-Inverse Document Frequency&#xff09;是一种用于文本挖掘和信息检索的统计方法&#xff0c;用来评估一个词语对于一个文档或一个语料库的重要程度。TF-IDF算法结合了词频&#xff08;TF&#xff09;和逆文档频率&#xff08;IDF&#xff0…

2-7 基于matlab实现声纹识别

基于matlab实现声纹识别&#xff0c;通过提取声音信号的MFCC特征&#xff0c;然后形成特征向量&#xff0c;通过训练语音&#xff0c;对测试语音进行识别&#xff0c;可以识别训练库内的声音&#xff0c;也可以识别出训练库外的声音。程序已调通&#xff0c;可直接运行。 2-7 m…

力扣每日一题 6/16 字符串 + 随机一题 动态规划/数学

博客主页&#xff1a;誓则盟约系列专栏&#xff1a;IT竞赛 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ 521.最长特殊序列 I【简单】 题目&#xff1a; 给你两个字符串 a 和 b&am…

人工智能模型组合学习的理论和实验实践

组合学习&#xff0c;即掌握将基本概念结合起来构建更复杂概念的能力&#xff0c;对人类认知至关重要&#xff0c;特别是在人类语言理解和视觉感知方面。这一概念与在未观察到的情况下推广的能力紧密相关。尽管它在智能中扮演着核心角色&#xff0c;但缺乏系统化的理论及实验研…

CodeQL从入门到入土

为什么在现在写这文章 CodeQL传闻找到了Log4j的漏洞&#xff0c;这段时间上边要求&#xff0c;把公司系统内部常见的问题用CodeQL写检测脚本&#xff0c;用于系统长期检测。主要是记录这段时间的学习&#xff0c;以及自己总结的常用写法。 一个需求&#xff0c;不同人写出来的…

二叉树-距离是K的二叉树节点(hard)

目录 一、问题描述 二、解题思路 1.总体思路&#xff08;DFSBFS结合&#xff09; 2.下面举具体例子来对思路进行解释 (1)返回值在一侧的情况 (2)返回值在两侧的情况 三、代码实现 四、刷题链接 一、问题描述 二、解题思路 1.总体思路&#xff08;DFSBFS结合&#xff0…

【2024亲测无坑】Oracle--19C在Centos7上的静默安装(rpm版)

一、Oracle 19c Linux安装&#xff08;Centos 7&#xff09; 1.查看磁盘可用空间及配置ip地址 [rootlocalhost /]# df -h 文件系统 容量 已用 可用 已用% 挂载点 devtmpfs 1.4G 0 1.4G 0% /dev tmpfs 1.4G …

Docker-Portainer可视化管理工具

Docker-Portainer可视化管理工具 文章目录 Docker-Portainer可视化管理工具介绍资源列表基础环境一、安装Docker二、配置Docker加速器三、拉取Portainer汉化版本镜像四、运行容器五、访问可视化界面 介绍 Portainer是一款开源的容器管理平台&#xff0c;它提供了一个直观易用的…

Nature|高性能柔性纤维电池 (柔性智能织物/可穿戴电子/界面调控/柔性电池/柔性电子)

2024年4月24日,复旦大学彭慧胜(Huisheng Peng)院士团队,在《Nature》上发布了一篇题为“High-performance fibre battery with polymer gel electrolyte”的论文,陆晨昊(Chenhao Lu)、Haibo Jiang和Xiangran Cheng为论文共同第一作者。论文内容如下: 一、 摘要 用聚合物凝…

基于Spring Boot的智能分析平台

项目介绍&#xff1a; 智能分析平台实现了用户导入需要分析的原始数据集后&#xff0c;利用AI自动生成可视化图表和分析结论&#xff0c;改善了传统BI系统需要用户具备相关数据分析技能的问题。该项目使用到的技术是SSMSpring Boot、redis、rabbitMq、mysql等。在项目中&#…

AMD平台,5600X+6650XT,虚拟机安装macOS 14(2024年6月)

AMD平台安装macOS 14的麻烦&#xff0c;要比Intel平台多的多&#xff0c;由于macOS从13开始&#xff0c;对CPU寄存器的读取进行了改变&#xff0c;导致AMD平台只要安装完macOS 13及以后版本&#xff0c;开机后就报五国语言错误&#xff0c;不断重启。改vmx文件&#xff0c;被证…