当前位置: 首页 > news >正文

Python学习笔记—100页Opencv详细讲解教程

目录

1 创建和显示窗口... - 4 -

2 加载显示图片... - 6 -

3 保存图片... - 7 -

4 视频采集... - 8 -

5视频录制... - 11 -

6 控制鼠标... - 12 -

7 TrackBar 控件... - 14 -

8.RGB和BGR颜色空间... - 16 -

9.HSV和HSL和YUV.. - 17 -

10 颜色空间的转化... - 18 -

11 mat的深浅拷贝... - 19 -

12 颜色通道的分离与合并... - 20 -

13 画直线... - 22 -

14 绘制矩形和圆... - 23 -

15 绘制椭圆... - 24 -

16 绘制多边形和填充多边形... - 25 -

17 绘制文本及中文文本... - 26 -

18 作业:根据需要画图... - 28 -

19 图像运算之加减乘除... - 30 -

20 图片的融合... - 32 -

21 Opencv的位运算... - 33 -

22 resize() 用法... - 35 -

23 图片上加Logo(完美贴合) - 36 -

24 图像的翻转与旋转... - 39 -

25 仿射变换之平移... - 40 -

26 仿射变换之获取变换矩阵... - 42 -

27  仿射变换之透视变换... - 44 -

28  卷积操作... - 45 -

29 均值滤波和方盒滤波... - 48 -

30 高斯滤波... - 49 -

31 中值滤波... - 50 -

32 双边滤波... - 51 -

33 索贝尔(sobel) 算子... - 52 -

34 scharr算子... - 53 -

35 拉普拉斯算子... - 54 -

36 形态学... - 55 -

37 Canny边缘检测... - 56 -

38 全局二值化... - 57 -

39 自适应阈值二值化... - 58 -

40 腐蚀操作... - 59 -

41 获取形态学卷积核... - 60 -

42 膨胀操作... - 61 -

43 开运算... - 62 -

44 闭运算... - 63 -

45 形态学梯度... - 64 -

46 顶帽操作... - 65 -

47 黑帽操作... - 66 -

48 查找轮廓... - 67 -

49 绘制轮廓... - 68 -

50 计算轮廓面积和周长... - 69 -

51 多边形逼近... - 71 -

52 凸包... - 72 -

53 最小外接矩形和最大外接矩形... - 74 -

54 高斯金字塔... - 76 -

55 拉普拉斯金字塔... - 78 -

56 图形直方图介绍... - 78 -

57 使用Opencv统计直方图... - 79 -

58绘制直方图... - 79 -

59用掩膜的直方图... - 80 -

60图均衡化... - 82 -

61 车辆统计项目(一)... - 83 -

71 特征检测基本概念... - 89 -

72 harris 角点检测数学原理1. - 90 -

73 Harris角点检测数学原理2. - 90 -

74 harris 角点检测应用... - 90 -

75 sift算法原理... - 91 -

76 sift算法使用... - 91 -

77 shi-tomasi 角点检测... - 91 -

1 创建和显示窗口

  1. namedWindow()       创建命名窗口
  2. imshow()                   显示窗口
  3. destroyAllwindws()    摧毁窗口
  4. resizeWindow()          改变窗口大小
  5. waitKey()                    等待用户输入

import cv2

# 创建窗口之前不要调整窗口大小

cv2.namedWindow('window', cv2.WINDOW_NORMAL)  # 创建窗口

cv2.resizeWindow('window', 600, 800)  # 调整窗口大小

# 显示图像

image = cv2.imread('path_to_image')

cv2.imshow('window', image)

# 等待按键后关闭窗口

cv2.waitKey(0)

cv2.destroyAllWindows()

确保在调用 cv2.resizeWindow 之前窗口已经创建,并且在窗口存在的情况下调整其大小。

  1. ord()计算ASCII数值

  1. import cv2


    #创建窗口
    # WINDOW_NORMAL 可以让窗口大小变得可调节,默认WINDOW_AUTOSIZE  自动大小
    cv2.namedWindow('new',cv2.WINDOW_NORMAL)
    cv2.resizeWindow(
    'new',600,800)

    # 展示名字为window的窗口
    cv2.imshow('window',0)   #没有内容只好写0
    cv2.resizeWindow('window',600,800)

    # 等待按键输入;0表示接收任意按键,如果给其他整数,表示等待按键的时间,单位毫秒;可以利用waitKey()实现关闭窗口
    key = cv2.waitKey(0)   #key 为键盘输入的ASCII
    if key & 0xFF == ord('q'):
       
    print('准备销毁窗口')
        cv2.destroyAllWindows()
    # 销毁所有窗口

2 加载显示图片

  1. imread(path,flag):使用imread可以读取图片,默认读取的是彩色图片。

    Matplotlib显示的图片和实际不一样,因为opencv读取的颜色通道是按照BGR排列的,一般照片是RGB,为了显示正常要用opencv的显示方法:

如果常用显示图片可以封装成函数,以后可以使用(自己所有的功能都可以封装起来,以后导入就可以直接用,方便积累)


import cv2

# 显示图片
def cv_show(name,img):
    cv2.imshow(
'name',img)
    cv2.waitKey(
0)
    cv2.destroyAllWindows()

import cv2
import monkey
import matplotlib.pyplot as plt
import numpy as np

# 读取图片
img = cv2.imread('2.jpg')


# 显示图片
monkey.cv_show('侯文广',img)
monkey.music_play()

3 保存图片

imwrite(path,img):使用imwrite保存图片

“./123.png” # 当前目录下的图片。

import cv2

cv2.namedWindow(
'img',cv2.WINDOW_NORMAL) #创建一个窗口
cv2.resizeWindow('img',320,240#设置窗口尺寸

img = cv2.imread('./2.jpg'# 载入当前目录下的图片

#利用while 循环优化退出逻辑
while True:
    cv2.imshow(
'img',img)
    key = cv2.waitKey(
0)    #接收键盘的输入字母的ASCII
   
if(key&0xff==ord('q')):
       
break
    elif
(key&0xff==ord('s')):
        cv2.imwrite(
r'D:/5.png',img)
       
print('保存成功')
       
break
    else
:
       
print(key)
       
break

cv2.destroyAllWindows()

4 视频采集

视频是由图片组成的,视频的每一帧就是一幅图片,一般是30帧。

cv2.VideoCapture可以捕获摄像头,用数字来表示不同的设备,比如0,1

如果是视频文件直接指定路径即可。

读取视频

import cv2
# 创建窗口
cv2.namedWindow('video',cv2.WINDOW_NORMAL)
cv2.resizeWindow(
'video',640,380)

# 打开视频文件
vc = cv2.VideoCapture('./nine.mp4')

# 循环读取摄像头每一帧
while True:
   
# 读每一帧数据,返回标记和这一帧数据frameTrue表示读到了数据,False表示没读到数据
   
ret,frame = vc.read()  # ret表示标记,frame表示图片

   
# 可以根据ret做个判断
   
if not ret:
       
# 没有读到数据
       
break
   
# 显示窗口
   
cv2.imshow('video',frame)

   
# 退出条件
   
key = cv2.waitKey(1)
   
if key == ord('q'):
       
break

# 别忘了释放资源
vc.release()
cv2.destroyAllWindows()

读取摄像头

import cv2# 创建窗口cv2.namedWindow('video',cv2.WINDOW_NORMAL)cv2.resizeWindow('video',640,380)# 打开摄像头vc1 = cv2.VideoCapture(0)# 循环读取摄像头每一帧while True:    # 读每一帧数据,返回标记和这一帧数据frameTrue表示读到了数据,False表示没读到数据    ret,frame = vc1.read()  # ret表示标记,frame表示图片    # 可以根据ret做个判断    if not ret:        # 没有读到数据        break    # 显示窗口    cv2.imshow('video',frame)    # 退出条件    key = cv2.waitKey(1000//30) #每帧图片之间的间隔时间ms30帧,每帧之间隔多久)


    if key ==ord('q'):
       
break

# 别忘了释放资源
vc1.release()
cv2.destroyAllWindows()

5视频录制

  1. VideoWriter:参数一为输出文件,参数二为多媒体文件格式(VideoWriter.fourcc),参数三为帧率,参数四为分辨率。
  2. write 编码并写入缓存
  3. release 缓存内容写入磁盘,并释放资源
  4. import cv2

    cap = cv2.VideoCapture(
    0# 打开摄像头

    # *mp4v就是解包操作,等同于'm','p','4','v'
    fourcc = cv2.VideoWriter.fourcc(*'mp4v')

    # (640,480)表示摄像头拍视频,这个大小搞错了不行
    # 主要是分辨率

    vw = cv2.VideoWriter('output.mp4', fourcc, 20, (640, 480))

    while cap.isOpened():
        ret, frame = cap.read()
       
    if not ret:
           
    print('can not receive framne ,Exiting ....')
           
    break

       
    vw.write(frame)
        cv2.imshow(
    'frame', frame)

       
    if cv2.waitKey(1) == ord('q'):
           
    break

6 控制鼠标

Opencv允许对窗口上的鼠标进行操作

  1. setMouseCallback(winname,callback,userdata),winname是窗口的名字,callback是回调函数,userdata是给回调函数的参数,
  2. callback(event,x,y,flags,userdata)回调函数包含这5个参数,event是事件(鼠标移动,左键,右键),x,y是点鼠标的坐标点,flags主要用于组合键,userdata是上面setMouseCallbackuserdata

鼠标事件:

  1. EVENT_MOUSEMOVE  0 鼠标移动
  2. EVENT_LBUTTONDOWN 1 按下鼠标左键
  3. EVENT_RBUTTONDOWN 2 按下鼠标右键
  4. EVENT_MBUTTONDOWN 3 按下鼠标中键
  5. EVENT_LBUTTONUP 4 左键释放
  6. EVENT_RBUTTONUP 5 右键释放
  7. EVENT_MBUTTONUP 6中键释放
  8. EVENT_LBUTTONDBLCLK 7 左键双击
  9. EVENT_RBUTTONDBLCLK 8 右键双击
  10. EVENT_MBUTTONDBLCLK 9 中键双击
  11. EVENT_MOUSEWHEEL 10鼠标滚轮上下滚动
  12. EVENT_MOUSEHWHEEL 11鼠标左右滚动

Flags:

  1. EVENT_FLAG_LBUTTON  1  按下左键
  2. EVENT_FLAG_RBUTTON   2 按下右键
  3. EVENT_FLAG_MBUTTON   4 按下中键
  4. EVENT_FLAG_CRTLKEY   8 按下CTRL键
  5. EVENT_FLAG_SHIFTKEY   16 按下SHIFTKEY键
  6. EVENT_FLAG_ALTKEY   32 按下ALT键
  7. import cv2
    import numpy as np

    # 函数名可以随便取,但是必须5个参数
    def mouse_callback(event,x,y,flags,userdata):
       
    # 内容根据具体作用进行更换(鼠标在窗口操作会触发函数)
       
    print(event,x,y,flags,userdata)
       
    # 根据event或者flags的值来定义函数
       
    # 按下鼠标右键退出
       
    if event == 2:
            cv2.destroyAllWindows()


    # 创建窗口
    cv2.namedWindow('mouse',cv2.WINDOW_NORMAL)
    # 窗口是宽度(列)高度(行)
    cv2.resizeWindow('mouse',640,360)

    # 设置鼠标回调函数
    # userdata'123'
    cv2.setMouseCallback('mouse',mouse_callback,'123')

    # 生成全黑图片
    # 先行(高)后列(宽)
    img = np.zeros((360,640,3),np.uint8)
    while True:
        cv2.imshow(
    'mouse',img)
        key = cv2.waitKey(
    1000//30)
       
    if key & 0xff == ord('q'):
           
    break

    cv2.destroyAllWindows()

7 TrackBar 控件

可以拖动的控件。

表示拖动了多少值。最多三原色控制

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

 创建TrackBar控件,valuetrackbar的默认值,countbar的最大值,trackbar的名字,窗口的名字。回调函数(trackbar动了会触发的结果)

  1. getTrackbarPos(trackbarname,winname)获取TrackBar当前值。

import cv2
import numpy as np

# 创建窗口
cv2.namedWindow('trackbar',cv2.WINDOW_NORMAL)
cv2.resizeWindow(
'trackbar',640,360)

# 定义回调函数
# 触发
def callback(value):
   
if value >= 50:
        
print(value)

# 创建trackbar
cv2.createTrackbar('R','trackbar',0,255,callback)
cv2.createTrackbar(
'G','trackbar',0,255,callback)
cv2.createTrackbar(
'B','trackbar',0,255,callback)

# 创建一个背景图片
img = np.zeros((360,640,3),np.uint8)

while True:
   
# 获取当前trackBar的值
   
r = cv2.getTrackbarPos('R','trackbar')
    g = cv2.getTrackbarPos(
'G', 'trackbar')
    b = cv2.getTrackbarPos(
'B', 'trackbar')

   
# 改变背景图颜色(bgr顺序)
   
img[:] = [b,g,r]
    cv2.imshow(
'trackbar',img)

    key = cv2.waitKey(
1000//30)
   
if key ==ord('q'):
       
break

cv2.destroyAllWindows()

8.RGB和BGR颜色空间

Opencv默认使用BGR排列顺序

9.HSV和HSL和YUV

Opencv采用最多HSV色彩空间

Hue:色相取值0—360°,从红色开始逆时针方向计算,红色为0°,绿色120°,蓝色240°。

Saturation:饱和度取值0—100%,饱和度高颜色越饱和,光谱色越多。越低越浅色。

Value(brightness):明度,光亮程度,0%黑,100%白

HSV(Hue, Saturation, Value)是根据颜色的直观特性由A. R. Smith在1978年创建的一种颜色空间, 也称六角锥体模型(Hexcone Model)。HSV色系对用户来说是一种直观的颜色模型,对于颜色,人们直观的会问”什么颜色?深浅如何?明暗如何?“,而HSV色系则直观的表示了这些信息。

每一种颜色都是由色相(Hue,简H),饱和度(Saturation,简S)和色明度(Value,简V)所表示的。这个模型中颜色的参数分别是:色调(H),饱和度(S),亮度(V)。

色调H参数表示色彩信息,即所处的光谱颜色的位置。该参数用一角度量来表示,取值范围为0°~360°。若从红色开始按逆时针方向计算,红色为0°,绿色为120°,蓝色为240°。它们的补色是:黄色为60°,青色为180°,紫色为300°;

饱和度S:取值范围为0.0~1.0;

亮度V:取值范围为0.0(黑色)~1.0(白色)。

10 颜色空间的转化

  1. cvtColor(img,colorspace):颜色转化关键API
  2.  import cv2

    def callback(value):
       
    # 鼠标不同操作value不同值
       
    print(value)

    cv2.namedWindow(
    'color',cv2.WINDOW_NORMAL)
    cv2.resizeWindow(
    'color',640,480)

    img = cv2.imread(
    '2.jpg')

    # 常见颜色空间转换
    colorspaces = [cv2.COLOR_BGR2RGBA,cv2.COLOR_BGR2BGRA,cv2.COLOR_BGR2GRAY,cv2.COLOR_BGR2HSV,cv2.COLOR_BGR2YUV]

    # trackbar
    cv2.createTrackbar('curcolor','color',0,4,callback)

    while True:
       
    # 获得trackbar上的值
       
    index = cv2.getTrackbarPos('curcolor','color')

       
    # 颜色空间转化API
       
    cvt_img = cv2.cvtColor(img,colorspaces[index])

        cv2.imshow(
    'color',cvt_img)
        key = cv2.waitKey(
    1000//30)
       
    if key & 0XFF == ord('q'):
           
    break

    cv2.destroyAllWindows()

11 mat的深浅拷贝

Mat是Opencv在C++语言中用来表示图像数据的一种数据结构,在python中转化为numpy的ndarray。

  1. MAT 数据结构 由header和data组成。Header中记录了图片的维数,大小,数据类型等数据。

Ndarray的四种常见属性:data(数据存放的地址),size(元素总个数),dtype(数据类型),shape(形状)

  1. Mat 共享数据

Header 不同,data相同。

Mat的深浅拷贝就是对ndarry的深浅拷贝。

import cv2
import numpy as np

img = cv2.imread(
'2.jpg')

相关文章:

Python学习笔记—100页Opencv详细讲解教程

目录 1 创建和显示窗口... - 4 - 2 加载显示图片... - 6 - 3 保存图片... - 7 - 4 视频采集... - 8 - 5视频录制... - 11 - 6 控制鼠标... - 12 - 7 TrackBar 控件... - 14 - 8.RGB和BGR颜色空间... - 16 - 9.HSV和HSL和YUV.. - 17 - 10 颜色空间的转化... - 18 - …...

C语言·分支和循环语句(超详细系列·全面总结)

前言:Hello大家好😘,我是心跳sy,为了更好地形成一个学习c语言的体系,最近将会更新关于c语言语法基础的知识,今天更新一下分支循环语句的知识点,我们一起来看看吧~ 目录 一、什么是语句&#xf…...

Gateway源码分析:路由Route、断言Predicate、Filter

文章目录 源码总流程图说明GateWayAutoConfigurationDispatcherHandlergetHandler()handleRequestWith()RouteToRequestUrlFilterReactiveLoadBalancerClientFilterNettyRoutingFilter 补充知识适配器模式 详细流程图 源码总流程图 在线总流程图 说明 Gateway的版本使用的是…...

ARM体系结构和接口技术(十)按键中断实验①

一、按键中断实验 (一)分析按键电路图 (二)芯片手册 二、按键中断实验分析 注:NVIC----Cortx-M核GIC----Cortx-A核 (一)查看所有外设的总线以及寄存器基地址 注:GIC的总线是A7核的…...

PostgreSQL使用(二)——插入、更新、删除数据

说明:本文介绍PostgreSQL的DML语言; 插入数据 -- 1.全字段插入,字段名可以省略 insert into tb_student values (1, 张三, 1990-01-01, 88.88);-- 2.部分字段插入,字段名必须写全 insert into tb_student (id, name) values (2,…...

有关css的题目

css样式来源有哪些&#xff1f; 内联样式&#xff1a; <a style"color: red"> </a> 内部样式&#xff1a;<style></style> 外部样式&#xff1a;写在独立的 .css文件中的 浏览器的默认样式 display有哪些属性 none - 不展示 block - 块类型…...

【开源库】libodb库编译及使用

前言 本文介绍windows平台下libodb库的编译及使用。 文末提供libodb-2.4.0编译好的msvc2019_64版本&#xff0c;可直接跳转自取 ODB库学习相关 【开源库学习】libodb库学习&#xff08;一&#xff09; 【开源库学习】libodb库学习&#xff08;二&#xff09; 【开源库学习】…...

电力需求预测挑战赛笔记 Task3 #Datawhale AI 夏令营

上文&#xff1a; 电力需求预测挑战赛笔记 Task2 #Datawhale AI 夏令营-CSDN博客文章浏览阅读80次。【代码】电力需求预测挑战赛笔记 Task2。https://blog.csdn.net/qq_23311271/article/details/140360632 前面我们介绍了如何使用经验模型以及常见的lightgbm决策树模型来解决…...

Promise 详解(原理篇)

目录 什么是 Promise 实现一个 Promise Promise 的声明 解决基本状态 添加 then 方法 解决异步实现 解决链式调用 完成 resolvePromise 函数 解决其他问题 添加 catch 方法 添加 finally 方法 添加 resolve、reject、race、all 等方法 如何验证我们的 Promise 是否…...

动态内存经典笔试题分析

目录 1.题目一 2.题目二 3.题目三 4.题目四 1.题目一 #include<stdlib.h> #include<stdio.h> #include<string.h> void GetMemory(char* p) {p (char*)malloc(100); } void Test(void) {char* str NULL;GetMemory(str);strcpy(str, "hello world…...

JS设计模式(一)单例模式

注释很详细&#xff0c;直接上代码 本文建立在已有JS面向对象基础的前提下&#xff0c;若无&#xff0c;请移步以下博客先行了解 JS面向对象&#xff08;一&#xff09;类与对象写法 特点和用途&#xff1a; 全局访问点&#xff1a;通过单例模式可以在整个应用程序中访问同一个…...

uniapp动态计算并设置元素高度

<template><view><scroll-view id"sv-box" :scroll-y"true" :style"{height:navHeightpx}"></scroll-view><view id"btn-box"><button>取消</button><button>确认</button><…...

直播架构如何设计核心节点和边缘节点

在直播架构中&#xff0c;核心节点和边缘节点的分工及主要服务是确保直播服务稳定、高效和可扩展的关键。以下是对这些节点的详细描述&#xff1a; 核心节点 核心节点通常位于数据中心&#xff0c;负责处理直播的主要逻辑和数据处理。其主要服务包括&#xff1a; 直播管理后…...

自动驾驶-预测概览

通过生成一条路径来预测一个物体的行为&#xff0c;在每一个时间段内&#xff0c;为每一辆汽车重新计算预测他们新生成的路径&#xff0c;这些预测路径为规划阶段做出决策提供了必要信息 预测路径有实时性的要求&#xff0c;预测模块能够学习新的行为。我们可以使用多源的数据…...

基于PSO算法优化PID参数的一些问题

目录 前言 Q1&#xff1a;惯性权重ω如何设置比较好&#xff1f;学习因子C1和C2如何设置&#xff1f; Q2&#xff1a;迭代速度边界设定一定能够遍历&#xff08;/覆盖&#xff09;整个PID参数二维空间范围吗&#xff1f;还是说需要与迭代次数相关&#xff1f;迭代次数越高&a…...

什么是决策树?

1. 什么是决策树&#xff1f; 决策树&#xff08;Decision Tree&#xff09;是一种常用的机器学习算法&#xff0c;用于解决分类和回归问题。它通过构建树结构来表示决策过程&#xff0c;分支节点表示特征选择&#xff0c;叶节点表示类别或回归值。 2. 决策树的组成部分 决策…...

ASP 快速参考

ASP 快速参考 概述 ASP&#xff08;Active Server Pages&#xff09;是一种由微软开发的服务器端脚本环境&#xff0c;用于动态网页设计和开发。它允许开发者创建和运行动态交互性网页&#xff0c;如访问数据库、发送电子邮件等。ASP页面通常以.asp为文件扩展名&#xff0c;并…...

(二)原生js案例之数码时钟计时

原生js实现的数字时间上下切换显示时间的效果&#xff0c;有参考相关设计&#xff0c;思路比较难&#xff0c;代码其实很简单 效果 代码实现 必要的样式 <style>* {padding: 0;margin: 0;}.content{/* text-align: center; */display: flex;align-items: center;justif…...

[CSS] 浮动布局的深入理解与应用

文章目录 浮动的简介元素浮动后的特点解决浮动产生的影响浮动后的影响解决浮动产生的影响 浮动相关属性实际应用示例示例1&#xff1a;图片与文字环绕示例2&#xff1a;多列布局示例3&#xff1a;响应式布局 总结 浮动布局是CSS中一种非常强大的布局方式&#xff0c;最初设计用…...

Linux云计算 |【第一阶段】ENGINEER-DAY2

主要内容&#xff1a; 磁盘空间管理fdisk、parted工具、开机自动挂载、文件系统、交换空间 KVM虚拟化 实操前骤&#xff1a; 1&#xff09;添加一块硬盘&#xff08;磁盘&#xff09;&#xff0c;需要关机才能进行操作&#xff0c;点击左下角【添加硬件】 2&#xff09;选择2…...

UDP(Echoserver)

网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法&#xff1a;netstat [选项] 功能&#xff1a;查看网络状态 常用选项&#xff1a; n 拒绝显示别名&#…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI

前一阵子在百度 AI 开发者大会上&#xff0c;看到基于小智 AI DIY 玩具的演示&#xff0c;感觉有点意思&#xff0c;想着自己也来试试。 如果只是想烧录现成的固件&#xff0c;乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外&#xff0c;还提供了基于网页版的 ESP LA…...

python如何将word的doc另存为docx

将 DOCX 文件另存为 DOCX 格式&#xff08;Python 实现&#xff09; 在 Python 中&#xff0c;你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是&#xff0c;.doc 是旧的 Word 格式&#xff0c;而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...

Spring Boot面试题精选汇总

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...

CMake控制VS2022项目文件分组

我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...

保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek

文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama&#xff08;有网络的电脑&#xff09;2.2.3 安装Ollama&#xff08;无网络的电脑&#xff09;2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...

Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)

引言 在人工智能飞速发展的今天&#xff0c;大语言模型&#xff08;Large Language Models, LLMs&#xff09;已成为技术领域的焦点。从智能写作到代码生成&#xff0c;LLM 的应用场景不断扩展&#xff0c;深刻改变了我们的工作和生活方式。然而&#xff0c;理解这些模型的内部…...

django blank 与 null的区别

1.blank blank控制表单验证时是否允许字段为空 2.null null控制数据库层面是否为空 但是&#xff0c;要注意以下几点&#xff1a; Django的表单验证与null无关&#xff1a;null参数控制的是数据库层面字段是否可以为NULL&#xff0c;而blank参数控制的是Django表单验证时字…...

【Linux】自动化构建-Make/Makefile

前言 上文我们讲到了Linux中的编译器gcc/g 【Linux】编译器gcc/g及其库的详细介绍-CSDN博客 本来我们将一个对于编译来说很重要的工具&#xff1a;make/makfile 1.背景 在一个工程中源文件不计其数&#xff0c;其按类型、功能、模块分别放在若干个目录中&#xff0c;mak…...

LOOI机器人的技术实现解析:从手势识别到边缘检测

LOOI机器人作为一款创新的AI硬件产品&#xff0c;通过将智能手机转变为具有情感交互能力的桌面机器人&#xff0c;展示了前沿AI技术与传统硬件设计的完美结合。作为AI与玩具领域的专家&#xff0c;我将全面解析LOOI的技术实现架构&#xff0c;特别是其手势识别、物体识别和环境…...