Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Swift学习笔记

Swift学习笔记

作者头像
落影
发布于 2018-04-27 07:05:39
发布于 2018-04-27 07:05:39
1.4K00
代码可运行
举报
文章被收录于专栏:落影的专栏落影的专栏
运行总次数:0
代码可运行

这是一篇学习swift的笔记

Objective-C是很好的语言,Runtime机制、消息机制等也是爱不释手。 Swift一直在更新,闲暇时间学一遍。学习的Blog:《从零开始学swift》 以下代码全部在playground进行的尝试

变量

let 是常量 var 是变量 不能修改的使用常量可以提高程序的可读性。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var str = "Hello, playground"
print(str)

let constA:Int = 12
let constB = 12
let constC = 12; let constD:Float = 12

元组:关系数据库中的基本概念,元组表中的一条记录,每列就是一个字段。因此在二维表里,元组也称为记录。元组是Swift中特有的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var abc = (10, 12, 30, "abc")
var score = (id:"1001", name:"张三", english_score:30, chinese_score:90)
score.english_score = 100
score

运算符

  • 引用号(.):实例调用属性、方法等操作符。
  • 问号(?):用来声明可选类型。
  • 感叹号(!):对可选类型值进行强制拆封。
  • 箭头(->):说明函数或方法返回值类型。
  • 冒号运算符(:):用于字典集合分割“键值”对。
  • ..< 运算符是一个非包函范围运算符,不包括上限值。
  • 运算符 ... :类似上面,包括上限值。
  • ?? 操作符: a ?? b 如果a不为nil,返回a里面的值,否则返回b的值

操作符要求类型一致(int8 和 int16是不同的)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let short:Int16 = 277
let sshort:Int8 = 100
//Int8(short) + sshort
short + Int16(sshort)

..<运算符

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  let arr = ["abc", "bcd"]
        for i in 0..<arr.count {
            if someC[i] != anotherC[i] {
                return false
            }

for in

遍历容器。可以用变量遍历,也可以用元组遍历。 如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var stList = [String]()
stList.insert("abc", atIndex: 0)
stList.insert("bcd", atIndex: 1)
stList.insert("cde", atIndex: 0)

var stList2:[String] = ["a", "B", "c"];

for st in stList2 {
    print(st)
}

for (index, value) in stList.enumerate() {
    print("index\(index):\(value)")
}

属性

属性类型
  • 存储属性:存储数据,分为常量属性(let)和变量属性(var),如下面的name和number。
  • 计算属性:不存储数据,通过计算其他属性返回数据,如下面的workYears。

当声明属性时,声明必须为它们设置初始值,或者在初始化时设置初始值。 如果不希望为属性设置初始值,必须声明它们作为可选。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var strLin = "loyinglin" //设置初始值
var str:String? //声明为可选
读写器
  • get
  • set
  • willSet
  • didSet 见下代码。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Person {
    var name:String = "loying"
    var number:Int = 2010551110
    private var mYear = 2016 {
        willSet(year) {
            print("willSet\(year)")
        }
        didSet(year) {
            print("didSet\(year)")
        }
    }
    var workYears:Int {
        get {
            print("get year")
        return 2016 - mYear
        }
        set(year) {
            if (year >= 0){
                mYear = 2016 - year
            }
        }
    }
}

访问权限控制

访问权限类型
  • public:可以访问自己模块中的任何public实体,也可以访问其他模块中的public实体。
  • internal:只能访问自己模块的任何internal实体,不能访问其他模块中的internal实体。默认权限是internal。
  • private:只能在当前源文件中使用的实体,称为私有实体。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Person {
    private var name:String = "loying"
    internal var number:Int = 2010551111
}
原则
  • 统一性原则:A如果包含B,那么A的权限开放等级大于等于B。 (元组类型的访问级别遵循元组中字段最低级的访问级别)
  • 设计原则:对外开放使用public,对外封闭使用internal或private。

结构体与类

结构体:值类型,每个实例没有独一无二的标识。

类:引用类型,每个实例有独一无二的标识。

可选链

可选链是一种可以调用属性、方法的过程,用于调用的对象可能为nil。 如果目标有值,调用就会成功;如果目标为nil,调用将返回nil。 多次请求或调用可以被链接成一个链,如果任意一个节点为nil将导致整条链失效。 ** 通过可选链调用方法时返回值总是可选类型的 **。 调用 Optional 对象方法前,必须拆包: 使用问号(?)声明的可选类型,在拆包时需要使用感叹号(!),这种拆包方式称为“显式拆包”; 使用感叹号(!)声明的可选类型,在拆包时可以不使用感叹号(!),这种表示方式称为“隐式拆包”。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var nilInt:String? = "abc"
let textNil = nilInt
if let test = nilInt {
    print("OK \(test)  \(textNil) \(textNil!)") //观察输出值
}
if (textNil != nil) {
    print("textNil \(textNil)")
}

函数

多种实现方式,具体如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func plus(width:Int, height:Int)->Int { //普通函数
    return width + height
}
print("1 + 2 = \(plus(1, height: 2))")
plus((Int)(short), height: Int(sshort))

func plus2(W width:Int, H Height:Int)->Int { //参数别名
    return width + Height
}
plus2(W:12, H:23)

func plus3(width:Int, _ Height:Int)->Int { //不带参数名
    return width + Height
}
plus3(22, 33)

func plus4(width:Int, _ Height:Int = 10)->Int { //默认参数值
    return width + Height
}
plus4(20, 20)
plus4(20)

func plusMore(width:(Length:Int, Size:Int), _ mul:Int) -> (Length:Int, Size:Int) { //元组参数
    let ret = (Length:width.Length * mul,
        Size:width.Size * mul)
    return ret
}
plusMore((Length: 20, Size: 5), 3)

构造函数

  • 便利构造函数:带convenience的init,必须调用指定构造函数
  • 指定构造函数:不带convenience的init。 构造函数的主要作用是初始化实例,包括初始化存储属性和其它的初始化。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 class Person {
    var name:String = "loying"
    var number:Int = 2010551110
      
    init(id:Int) {
        number = id
    }
    convenience init() {
        self.init(id:0)
    }
}

继承

在Swift中,类是单继承。多重继承通过多个协议实现。

属性、方法、下标

类可以继承另一个类的方法、属性、下标等特征。 子类继承父类后,可以重写父类的方法、属性、下标等特征。

读写器

你可以将一个继承来的只读属性重写为一个读写属性,只需要你在重写版本的属性里提供 getter 和 setter 即可。但是,不可以将一个继承来的读写属性重写为一个只读属性。 你不可以为继承来的常量存储型属性或继承来的只读计算型属性添加属性观察器。这些属性的值是不可以被设置的,所以,为它们提供willSet 或didSet 实现是不恰当。

重写静态属性

我们可以在子类中重写从父类继承来的属性,属性有实例属性和静态属性之分。 class修饰的属性可以被重写,static关键字就不能被重写。

重写静态方法

静态方法使用class或static关键字,class修饰的静态方法可以被重写,static关键字就不能被重写。

重写属性

下标是一种特殊属性。子类属性重写是重写属性的getter和setter访问器,对下标的重写也是重写下标的getter和setter访问器。

final

final声明的类不能被继承,final声明的属性、方法和下标不能被重写。

错误处理

Cocoa错误处理模式

构造函数的最后一个参数是NSErrorPointer(即NSError指针),那么在实际调用时候我们需要传递err变量地址(即&err),&是取地址符。当方法调用完成后,如果有错误则err变量会被赋值。

swift错误处理模式

使用do - try - catch 模式 使用了try?语句没有必要使用do-catch语句将其包裹起来。 所以使用try!打破错误传播链条时,应该确保程序不会发生错误。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
do {
    let path:String? = NSBundle.mainBundle().pathForResource("text", ofType: "txt")
    
    let str = try NSString(contentsOfFile:path!, encoding:NSUTF8StringEncoding)
    print(str)
}
catch let err as NSError {
    err.description
}

捕获列表

捕获列表中的每个元素都是由weak或者unowned关键字和实例的引用(如self)成对组成。每一对都在方括号中,通过逗号分开

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
NSNotificationCenter.defaultCenter().addObserverForName("DoneModelChange", object: nil, queue: nil) { [unowned self](note) -> Void in
            self.tableView.reloadData()
        }

闭包

尾随闭包

闭包表达式是函数最后一个参数,调用函数可以使用尾随闭包写法。 如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func plusAfterMul(plus:Int, factor1:Int, factor2:Int, funMul:(Int, Int)->Int)->Int {
    return plus + funMul(factor1, factor2)
}
plusAfterMul(1, factor1: 2, factor2: 3) {
    (a:Int, b:Int)->Int in
    var ret = 1
    var count = b
    while count > 0 {
        --count
        ret *= a
    }
    return ret
}
单一表达式隐式返回

如下,排序函数的第二个参数的函数类型明确指出,一个布尔值必须由闭包返回。因为闭包体内含有一个表达式(s1 > s2)返回一个布尔值, 不会出现歧义,其返回关键字可以省略。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let count = [5, 10, -6, 75, 20]
var descending = sorted(count, { n1, n2 in n1 > n2 })
var ascending = sorted(count, { n1, n2 in n1 < n2 })
println(descending)
println(ascending)

Any、AnyObject

AnyObject是一个协议,Any是零个协议。 AnyObject用于任何类实例,而Any用于任何变量。 AnyObject 可以代表任何 class 类型的实例。 看如下例子 声明一个 Int 和一个 String,按理说它们都应该只能被 Any 代表,而不能被 AnyObject 代表的。 实际上,元素其实已经变成了 NSNumber 和 NSString 。因为我们 import 了 UIKit 。因为我们显式地声明了需要 AnyObject,编译器认为我们需要的的是 Cocoa 类型而非原生类型,而帮我们进行了自动的转换。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import UIKit
let swiftInt: Int = 1
let swiftString: String = "miao"
var array: [AnyObject] = []
array.append(swiftInt)
array.append(swiftString)

在上面的代码中如果我们把 import UIKit 去掉,会得到无法适配 AnyObject 的编译错误。 可以把声明 array 的 [AnyObject] 换成 [Any]。

关联类型

Swift 允许相关类型,并可由关键字“typealias”协议定义内部声明。

  • 类似typedef,可以给对象一个别名;
  • 代表泛型;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
protocol Container {
    typealias ItemType
    mutating func append(item: ItemType)
    var count: Int { get }
    subscript(i: Int) -> ItemType { get }
}

运算符重载

Paste_Image.png

惰性初始化

  • 简单表达式

lazy var first = NSArray(objects: "1","2")

  • 闭包

lazy var second:String = { return "second" }()

不要忘记最后的小括号,只有加了小括号,闭包才会在调用的时立刻执行。

要类型声明lazy var second:String 这样Xcode会进行类型检查。

泛型函数、协议的应用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
protocol Container {
    typealias ItemType
    mutating func append(item: ItemType)
    var count: Int { get }
    subscript(i: Int) -> ItemType { get }
}

struct Stack<T>: Container {
    var items = [T]()
    
    mutating func push(item: T) {
        items.append(item)
    }
    
    mutating func append(item: T) {
        self.push(item)
    }
    
    var count: Int {
        return items.count
    }
    
    subscript(i: Int) -> T {
        return items[i]
    }
}

func allItemsMatch<
    C1: Container, C2: Container
    where C1.ItemType == C2.ItemType, C1.ItemType:Equatable>(someC: C1, anotherC: C2) -> Bool {
        if someC.count != anotherC.count {
            return false
        }
        
        for i in 0..<someC.count {
            if someC[i] != anotherC[i] {
                return false
            }
        }
        
        return true
}

var stackOfStrings = Stack<String>()
stackOfStrings.push("abc")
stackOfStrings.push("qwe")

var arrayOfString = Stack<String>()
arrayOfString.push("abc")
arrayOfString.push("aaa")

if allItemsMatch(stackOfStrings, anotherC: arrayOfString) {
    print("ok")
}
else {
    print("not equal")
}

总结

学习的过程中,先对着《从零开始学swift》,把swift的代码实现一遍。 大概有300多行代码,写完之后语法基本熟悉了。 然后找一个oc的项目,把里面的oc代码全部用swift实现一遍。swift入门就结束了。 整个代码文件如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//: Playground - noun: a place where people can play

import UIKit

//看右侧
var str = "Hello, playground"

//简单的打印
print(str)

let image = UIImage(named: "abc.jpeg")

let view = UIView(frame: CGRectMake(0, 0, 100, 100))

let constA:Int = 12
let constB = 12
let constC = 12; let constD:Float = 12

var abc = (10, 12, 30, "abc")
var score = (id:"1001", name:"张三", english_score:30, chinese_score:90)
score.english_score = 100
score

var strLin = "loyinglin"

strLin.insert("L", atIndex: strLin.endIndex)

//strLin.insertContentsOf("abc", at: strLin.endIndex)

//strLin.replaceRange(range, with: "abc")
(strLin as NSString).substringWithRange(NSMakeRange(0, 4))
strLin.substringWithRange(Range(start: strLin.startIndex.advancedBy(1), end: strLin.endIndex.advancedBy(-2)))

let short:Int16 = 277
let sshort:Int8 = 100
//Int8(short) + sshort
short + Int16(sshort)

var stList = [String]()
stList.insert("abc", atIndex: 0)
stList.insert("bcd", atIndex: 1)
stList.insert("cde", atIndex: 0)

var stList2:[String] = ["a", "B", "c"];

for st in stList2 {
    print(st)
}

for (index, value) in stList.enumerate() {
    print("index\(index):\(value)")
}

func plus(width:Int, height:Int)->Int {
    return width + height
}
print("1 + 2 = \(plus(1, height: 2))")
plus((Int)(short), height: Int(sshort))

func plus2(W width:Int, H Height:Int)->Int {
    return width + Height
}
plus2(W:12, H:23)

func plus3(width:Int, _ Height:Int)->Int {
    return width + Height
}
plus3(22, 33)

func plus4(width:Int, _ Height:Int = 10)->Int {
    return width + Height
}
plus4(20, 20)
plus4(20)

func plusMore(width:(Length:Int, Size:Int), _ mul:Int) -> (Length:Int, Size:Int) {
    let ret = (Length:width.Length * mul,
        Size:width.Size * mul)
    return ret
}
plusMore((Length: 20, Size: 5), 3)

func plusAfterMul(plus:Int, factor1:Int, factor2:Int, funMul:(Int, Int)->Int)->Int {
    return plus + funMul(factor1, factor2)
}
plusAfterMul(1, factor1: 2, factor2: 3) {
    (a:Int, b:Int)->Int in
    var ret = 1
    var count = b
    while count > 0 {
        --count
        ret *= a
    }
    return ret
}

enum Days:Int{
    case Mon
    case Tus, Wed, Thu, Fri
}

var bool = Days.Mon == Days.Thu

internal class Department {
    var dName:String = "department-1"
    let dNumber:Int = 123
}

private class Person {
    var name:String = "loying"
    var number:Int = 2010551110
    private var mYear = 2016 {
        willSet(year) {
            print("willSet\(year)")
        }
        didSet(year) {
            print("didSet\(year)")
        }
    }
    var Dept:Department?
    var YDept:Department!
    var workYears:Int {
        get {
            print("get year")
        return 2016 - mYear
        }
        set(year) {
            if (year >= 0){
                mYear = 2016 - year
            }
        }
    }
    
    init(id:Int) {
        number = id
        print("total person\(++Person.totalPerson) and \(self)")
    }
    
    

    convenience init() {
        self.init(id:0)
    }
    
    static var totalPerson = 0
}

private class Student: Person {
    var school:String {
        willSet(value) {
            print("school is \(value)")
        }
    }
    convenience init(sch:String) {
        self.init(sch:sch, id:123)
    }
    init(sch:String, id:Int) {
        school = sch
        super.init(id: id)
    }
    
    override var workYears:Int {
        get {
            return super.workYears
        }
        set(year) {
            super.workYears = year
        }
    }
    
    init() {
        school = "ly"
        super.init(id:123)
    }
    
    deinit {
        print("dealloc \(school)")
    }
    
}

private var st = Student(sch: "abc")
st.school
st.workYears

private var man = Person()
man = Person(id: 123)
man.number
man.mYear
man.workYears
man.workYears = 3
man.mYear
Person()

private var arrMen = [st, man]
for item in arrMen {
    let test = item as? Student
    if (test != nil) {
        (item as! Student).workYears
        print("item is student in \(test?.workYears)")
    }
    if let test2 = item as? Student {
        print("test2 \(test2)")
    }
}

man.Dept?.dNumber
man.Dept = Department()
man.Dept!.dNumber

man.YDept?.dNumber

var opStr:String?
print(opStr)
//print(opStr!)

var nilInt:String? = "abc"
let textNil = nilInt
if let test = nilInt {
    print("OK \(test)  \(textNil) \(textNil!)")
}
if (textNil != nil) {
    print("textNil \(textNil)")
}

struct DoubleArray: Equatable {
    let rows:Int, columns:Int
    var grid:[Int]
    init(row:Int, column:Int) {
        self.columns = column
        self.rows = row
        
        grid = Array(count: row * column, repeatedValue: 0)
    }
    
    subscript(row:Int, column:Int)->Int {
        return grid[row * columns + column]
    }
    mutating func setValue(row:Int, column:Int, value:Int) {
        grid[row * columns + column] = value
    }
    
    var count:Int {
        return grid.count
    }
}
func ==(lhs: DoubleArray, rhs: DoubleArray) -> Bool {
    return lhs.count == rhs.count
}

var dArr:DoubleArray = DoubleArray(row: 3, column: 3)
dArr[2, 2]
dArr.setValue(1, column: 1, value: 1)
dArr[1, 1]

extension Int {
    var lyDesc:String {
        var desc = ""
        switch (self) {
        case 4: desc = "Bad"
        case 8: desc = "Good"
        default:desc = "nothing"
        }
        return desc
    }
    
    func lyPrint() {
        print("ly Print self:\(self)")
    }
}

1.lyDesc
4.lyDesc
8.lyDesc

1234567.lyPrint()

var ab = {(a:Int, b:Int) -> Int in
    var ret = a + b
    return ++ret
}
ab(3, 4)

var moba:(Int, Int)->Int = {$0 * $1}
moba(4, 6)

do {
    let path:String? = NSBundle.mainBundle().pathForResource("text", ofType: "txt")
    
    let str = try NSString(contentsOfFile:path!, encoding:NSUTF8StringEncoding)
    print(str)
}
catch let err as NSError {
    err.description
}
str

var msg:String!
if msg != nil {
    
}
else {
    print("OJ\(msg)")
}

protocol Container {
    typealias ItemType
    mutating func append(item: ItemType)
    var count: Int { get }
    subscript(i: Int) -> ItemType { get }
}

struct Stack<T>: Container {
    var items = [T]()
    
    mutating func push(item: T) {
        items.append(item)
    }
    
    mutating func append(item: T) {
        self.push(item)
    }
    
    var count: Int {
        return items.count
    }
    
    subscript(i: Int) -> T {
        return items[i]
    }
}

func allItemsMatch<
    C1: Container, C2: Container
    where C1.ItemType == C2.ItemType, C1.ItemType:Equatable>(someC: C1, anotherC: C2) -> Bool {
        if someC.count != anotherC.count {
            return false
        }
        
        for i in 0..<someC.count {
            if someC[i] != anotherC[i] {
                return false
            }
        }
        
        return true
}

var stackOfStrings = Stack<String>()
stackOfStrings.push("abc")
stackOfStrings.push("qwe")

var arrayOfString = Stack<String>()
arrayOfString.push("abc")
arrayOfString.push("aaa")

if allItemsMatch(stackOfStrings, anotherC: arrayOfString) {
    print("ok")
}
else {
    print("not equal")
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016.04.12 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
深度相机(TOF)的工作原理
TOF(Time of flight)直译为“飞行时间”。其测距原理是通过给目标连续发送光脉冲,然后用传感器接收从物体返回的光,通过探测光脉冲的飞行(往返)时间来得到目标物距离。这种技术跟3D激光传感器原理基本类似,只不过3D激光传感器是逐点扫描,而TOF相机则是同时得到整幅图像的深度(距离)信息。
全栈程序员站长
2022/09/01
2.6K0
深度相机(TOF)的工作原理
智能手机双摄像头原理解析:RGB +Depth
用户1150922
2018/01/08
5.4K0
智能手机双摄像头原理解析:RGB +Depth
52. 光的飞行时间技术 (TOF系列2)
诚如你在飞秒摄影介绍中所看到的,TOF技术是将时间维度的信息转换为空间维度信息的方法,其本质原理是我们在小学时就学过这样的公式: 距离 = 速度 * 时间
HawkWang
2021/03/16
7490
52. 光的飞行时间技术 (TOF系列2)
3D深度传感ToF技术的基本原理解析
飞行时间(ToF)相机凭借更小的外形尺寸、更宽的动态感测范围,以及在多种环境下工作的能力,成为首选的深度传感方法。虽然ToF技术已在科学和军事领域应用多年,但随着21世纪初图像传感技术的进步,才得到更加普遍的应用。性能的变革意味着,包括 ADI ToF 技术在内的探测技术,已被应用到智能手机、消费电子和游戏设备中,未来将不仅限于消费市场。随着技术的进一步成熟,将有机会利用主流制造工艺从设计、制造和货物运输等多方面来提高系统效率。
小白学视觉
2022/02/12
1.7K0
3D深度传感ToF技术的基本原理解析
3D成像方法 汇总(原理解析)— 双目视觉、激光三角、结构光、ToF、光场、全息
这里要介绍的是真正的3D成像,得到物体三维的图形,是立体的图像。而不是利用人眼视觉差异的特点,错误感知到的假三维信息。
3D视觉工坊
2021/05/18
4.7K0
3D成像方法 汇总(原理解析)— 双目视觉、激光三角、结构光、ToF、光场、全息
ToF相机学习笔记之基本知识
ToF相机属于一种非接触式光学传感器,通过计算发射激光的飞行时间获取对应像素的深度信息。就非接触式距离测量方法而言,其分类可用下表表示如下:
全栈程序员站长
2022/08/31
4270
ToF相机学习笔记之基本知识
三种主流深度相机介绍
深度相机又称之为3D相机,顾名思义,就是通过该相机能检测出拍摄空间的景深距离,这也是与普通摄像头最大的区别。
点云PCL博主
2019/07/30
5.8K0
三种主流深度相机介绍
TOF飞行时间深度相机介绍
飞行时间原理是基于测量波从震源(飞行时间传感器)到目标和返回所需的时间,基于这些数据以及一些数学和物理知识(如波传播)可以确定该物体与震源的距离,根据技术的不同,可以使用不同类型的波来获得不同的结果,飞行时间是捕捉3D图像的几种方法之一,例如立体相机(具有两个单独的镜头以模拟人类视觉并重建深度感知的相机)或结构光成像(将结构图像投影到对象上,并根据网格的变形计算该对象的形状和距离)。
点云PCL博主
2022/09/13
1.2K0
TOF飞行时间深度相机介绍
干货 | LIDAR、ToF相机、双目相机如何科学选择?「建议收藏」
三维成像技术原理和应用想必大家在之前的文章中了解过啦,今天想给大家比较一下LIDAR、ToF 相机以及双目相机,并且还有一些直观的测试数据来展示各自的优缺点,是骡子是马拉出来溜溜!
全栈程序员站长
2022/09/01
1.4K0
干货 | LIDAR、ToF相机、双目相机如何科学选择?「建议收藏」
深度解析机器视觉四大光学成像方法
工业4.0时代,三维机器视觉备受关注,目前,三维机器视觉成像方法主要分为光学成像法和非光学成像法,这之中,光学成像法是市场主流。
一点人工一点智能
2023/03/17
1.1K0
深度解析机器视觉四大光学成像方法
深度相机+激光雷达实现SLAM建图与导航
随着机器视觉,自动驾驶等颠覆性的技术逐步发展,采用3D相机进行物体识别,行为识别,场景建模的相关应用越来越多,可以说深度相机就是终端和机器人的眼睛,那么什么是深度相机呢,跟之前的普通相机(2D)想比较,又有哪些差别?深度相机又称之为3D相机,顾名思义,就是通过该相机能检测出拍摄空间的景深距离,这也是与普通摄像头最大的区别。
一点人工一点智能
2023/03/05
3.9K0
深度相机+激光雷达实现SLAM建图与导航
54. 多径干扰-3D相机面临的另一个挑战 (TOF系列4)
在上一篇文章:53. 3D相机面临的困难问题和解决方案 (TOF系列3)中,我们看到了影响3D相机在实际环境中使用的第一个因素:环境光照
HawkWang
2021/04/07
1.3K0
54. 多径干扰-3D相机面临的另一个挑战 (TOF系列4)
3D视觉传感技术:时间飞行法 (ToF) 技术分析
3D视觉传感技术是一项重要的科学突破。它是一种深度传感技术,增强了摄像机进行面部和目标识别的能力。相对于2D技术,3D技术除了显示对象的X和Y值之外,还可以提供记录场景或对象的深度值,在感知和处理日常活动的方式上带来了独特的进步,制造商争先恐后地将这些新的进步融入到手机等消费产品中。该技术利用光学技术模拟人类视觉系统,促进了增强现实、人工智能和物联网的出现和应用。
3D视觉工坊
2021/07/27
4.4K1
激光slam与视觉slam优缺点_摄影光学与镜头
Slam:同步定位与建图,就是在定位的同时,建立环境地图。 主要思路是根据运动学模型计算位姿,并通过传感得到的环境信息,对估计位姿调整优化,从而得到准确位姿,根据定位及感知数据绘制地图。 下图为slam主流框架:
全栈程序员站长
2022/09/23
3.4K0
激光slam与视觉slam优缺点_摄影光学与镜头
深度相机-介绍
双目立体成像:zspace的桌面一体机, intel的RealSense主动双目系列,未来立体的桌面一体机。
孙寅
2022/03/24
1.5K0
深度相机-介绍
3D视觉传感技术科普
深度传感镜头作为智能手机创新模式,苹果在最新版iPad Pro上搭载了D-ToF(直接飞行时间法)深度传感镜头,推动了3D视觉在消费场景的应用。
孙寅
2021/12/21
1.3K0
3D视觉传感技术科普
【深度相机系列一】iPhone X的原深感相机到底是个什么玩意?
iPhone X的前置原深感相机由红外镜头、泛光感应元件、距离传感器、环境光传感器、扬声器、麦克风、700万像素摄像头、点阵投影器组成。通过结构光技术,可以获取场景中物体距离摄像头的距离,用于人脸识别、动画表情等。该技术安全性高,可识别出普通RGB相机难以处理的攻击,也可以用于人脸活体检测。苹果将其用于Face ID,并衍生出艺术自拍、人像光效、动画表情等玩法。该技术还可用于三维建模、自然人机交互、AR/VR、自动驾驶等领域。
用户1150922
2018/01/08
4.1K0
【深度相机系列一】iPhone X的原深感相机到底是个什么玩意?
UWB常用的算法——飞行时间 (ToF)
基于恒定的光速,飞行时间 (ToF) 计算使用信号传播时间来确定距离。图 1 基本说明了 ToF 计算如何在配备 UWB 的任何两个设备(例如汽车和遥控钥匙)之间进行。
李肖遥
2022/09/10
2K0
UWB常用的算法——飞行时间 (ToF)
55. 对极TOF成像 - 超越传统ToF的方案(TOF系列5)
本文同步发表在我的微信公众号和知乎专栏“计算摄影学”,欢迎扫码关注,转载请注明作者和来源
HawkWang
2021/04/23
8880
机器人视觉避障原来是这样的
避障是指移动机器人在行走过程中,通过传感器感知到在其规划路线上存在静态或动态障碍物时,按照 一定的算法实时更新路径,绕过障碍物,最后达到目标点。
小白学视觉
2019/11/12
1.5K0
推荐阅读
相关推荐
深度相机(TOF)的工作原理
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验