精华内容
下载资源
问答
  • 是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows、Android和Mac OS操作系统上。它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口...

    早上用百度搜了一下“颜色识别”,多少有了一点大致的概念,还是老办法,动手做,多实验,往前走,还请各位老师多多指点。

    OpenCV(百度百科)
    是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows、Android和Mac OS操作系统上。它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。OpenCV用C++语言编写,它的主要接口也是C++语言,但是依然保留了大量的C语言接口。该库也有大量的Python、Java and MATLAB/OCTAVE(版本2.5)的接口。这些语言的API接口函数可以通过在线文档获得。如今也提供对于C#、Ch、Ruby,GO的支持。

    OpenCV于1999年由Intel建立,如今由Willow Garage提供支持。OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows和Mac OS操作系统上。它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。OpenCV 拥有包括 500 多个C函数的跨平台的中、高层 API。它不依赖于其它的外部库——尽管也可以使用某些外部库。OpenCV 为Intel® Integrated Performance Primitives(IPP)提供了透明接口。这意味着如果有为特定处理器优化的 IPP 库,OpenCV 将在运行时自动加载这些库。 (注:OpenCV 2.0版的代码已显著优化,无需IPP来提升性能,故2.0版不再提供IPP接口)

    在这里插入图片描述

    OpenCV概述
    其全称是Open source Computer Vision Library,开放源代码计算机视觉库。也就是说,它是一套关于计算机视觉的开放源代码的API函数库。这也就意味着:
    (1)不管是科学研究,还是商业应用,都可以利用它来作开发;
    (2)所有API函数的源代码都是公开的,你可以看到其内部实现的程序步骤;
    (3)你可以修改OpenCV的源代码,编译生成你需要的特定API函数。但是,作为一个库,它所提供的,仅仅是一些常用的,经典的,大众化的算法的API。

    一个典型的计算机视觉算法,应该包含以下一些步骤:
    (1)数据获取(对OpenCV来说,就是图片);
    (2)预处理;
    (3)特征提取;
    (4)特征选择;
    (5)分类器设计与训练;
    (6)分类判别;
    而OpenCV对这六个部分,分别(记住这个词)提供了API。
    在这里插入图片描述
    基于OpenCV的颜色识别

    彩色模型
    数字图像处理中常用的采用模型是RGB(红,绿,蓝)模型和HSV(色调,饱和度,亮度),RGB广泛应用于彩色监视器和彩色视频摄像机,我们平时的图片一般都是RGB模型。而HSV模型更符合人描述和解释颜色的方式,HSV的彩色描述对人来说是自然且非常直观的。

    HSV模型
    HSV模型中颜色的参数分别是:色调(H:hue),饱和度(S:saturation),亮度(V:value)。由A. R. Smith在1978年创建的一种颜色空间, 也称六角锥体模型(Hexcone Model)。

    色调(H:hue):用角度度量,取值范围为0°~360°,从红色开始按逆时针方向计算,红色为0°,绿色为120°,蓝色为240°。它们的补色是:黄色为60°,青色为180°,品红为300°;
    饱和度(S:saturation):取值范围为0.0~1.0,值越大,颜色越饱和。
    亮度(V:value):取值范围为0(黑色)~255(白色)。

    RGB转成HSV
    设 (r, g, b) 分别是一个颜色的红、绿和蓝坐标,它们的值是在 0 到 1 之间的实数。设 max 等价于 r, g 和 b 中的最大者。设 min 等于这些值中的最小者。要找到在 HSV 空间中的 (h, s, v) 值,这里的 h ∈ [0, 360)是角度的色相角,而 s, v ∈ [0,1] 是饱和度和亮度。 OpenCV下有个函数可以直接将RGB模型转换为HSV模型,OpenCV中H∈ [0, 180), S ∈ [0, 255], V ∈ [0, 255]。我们知道H分量基本能表示一个物体的颜色,但是S和V的取值也要在一定范围内,因为S代表的是H所表示的那个颜色和白色的混合程度,也就说S越小,颜色越发白,也就是越浅;V代表的是H所表示的那个颜色和黑色的混合程度,也就说V越小,颜色越发黑。大致识别蓝色的取值是 H在100到140,S和V都在90到255之间。
    在这里插入图片描述

    OpenCV颜色识别思路

    1、创建滑动条:用来调节阈值,识别出不同颜色。

    2、颜色空间转换:将RGB转换为HSV模型,于是可以通过不同颜色的HSV的阈值不同来识别出该种颜色。Opencv中使用cvtcolor()可实现。一般彩色图像都是RGB颜色空间,而HSV色彩空间模型是一种在人们生活中甚至更常用的颜色系统,在电视遥控器上、在画画的调色板中、在看电视时调整亮度时都很常见,因为它更符合人们描述颜色的方式——是什么颜色、颜色有多深、颜色有多亮。需要注意的是,在opencv中,H、S、V值范围分别是[0,180),[0,255),[0,255),而非实际模型[0,360],[0,1],[0,1]。

    3、直方图均衡化:由于光线的影响,手机读取的每一帧图片可能存在太亮或者太暗的问题,直方图均衡化可以将每个区间的像素点分布更均衡,使图像的层次感更强。Opencv中可以用equalizeHist()函数实现。直方图均衡化就是将原始的直方图拉伸,使之均匀分布在全部灰度范围内,从而增强图像的对比度。直方图均衡化的中心思想是把原始图像的的灰度直方图从比较集中的某个区域变成在全部灰度范围内的均匀分布

    4、二值化:将图像上的像素点的灰度值设置为0或255,这样将使整个图像呈现出明显的黑白效果。对灰度图像进行二值化处理,可以突出一定范围的信息。它是将像素点颜色值在所设定区间内(如a-b)的设定为255,在范围外的设为0.但是对于ab和的不同取值,二值化的效果会有很大的不同。

    5、开操作:用来去除图像中的噪点,即干扰信息。Opencv中可以使用getStructuringElement()函数来进行相应设置。开操作是基于图像的膨胀和腐蚀而言的,膨胀就是对图像高亮部分进行“领域扩张”,效果图拥有比原图更大的高亮区域;腐蚀是原图中的高亮区域被蚕食,效果图拥有比原图更小的高亮区域。而开操作是对图像先腐蚀再膨胀,用来消除小物体。其数学原理是定义一个卷积核B,将其与目标图像进行卷积,就可以达到相应效果。不同形状和大小的核会出现不同的效果。

    6、闭操作 :进行开操作之后可能会有一些断开的区域,闭操作可以将这些未联通的区域进行封闭,使图像更完整。闭操作是开操作的相反,先膨胀再腐蚀,用于排除小型黑洞,其原理与开操作相同。

    手头正好有个魔方,有五种颜色,就拿它当识别颜色的实验道具了。
    在这里插入图片描述
    打开MaixPy IDE,选择工具——机器视觉——阕值编辑器
    在这里插入图片描述
    打开源图像位置,选择帧缓冲区
    在这里插入图片描述

    调整LAB阕值,主要是在二进制图像栏,白色像素是被跟踪的像素
    在这里插入图片描述
    彻底搞懂Lab 颜色空间
    名称
    在开始之前,先明确一下Lab颜色空间(Lab color space)的名字:
    Lab的全称是CIELAB,有时候也写成CIE Lab*
    这里的CIE代表International Commission on Illumination(国际照明委员会),它是一个关于光照、颜色等的国际权威组织。
    通道
    Lab是由一个亮度通道(channel)和两个颜色通道组成的。在Lab颜色空间中,每个颜色用L、a、b三个数字表示,各个分量的含义是这样的:
    L代表亮度
    a
    代表从绿色到红色的分量
    b代表从蓝色到黄色的分量
    Perceptual uniform
    Lab是基于人对颜色的感觉来设计的,更具体地说,它是感知均匀(perceptual uniform)的。Perceptual uniform的意思是,如果数字(即前面提到的L、a、b这三个数)变化的幅度一样,那么它给人带来视觉上的变化幅度也差不多。Lab相较于RGB与CMYK等颜色空间更符合人类视觉,也更容易调整:想要调节亮度(不考虑Helmholtz–Kohlrausch effect,见下注)就调节L通道,想要调节只色彩平衡就分别调a和b。
    注:Helmholtz–Kohlrausch effect是人眼的一种错觉——当色彩饱和度高时,颜色会看起来更亮。
    设备无关
    Lab有个很好的特性——设备无关(device-independent)。也就是说,在给定了颜色空间白点(white point)(下图中表示了一种颜色空间的白点)之后,这个颜色空间就能明确地确定各个颜色是如何被创建和显示的,与使用的显示介质没有关系。 需要注意的是,Lab定义的是相对于白点的颜色,只有定义完白点是什么颜色(比如定义为CIE standard illuminant D50),我们才能知道其他的颜色。
    数值范围
    理论上说,L、a、b
    都是实数,不过实际一般限定在一个整数范围内:
    L越大,亮度越高。L为0时代表黑色,为100时代表白色。
    a和b为0时都代表灰色。
    a从负数变到正数,对应颜色从绿色变到红色。
    b
    从负数变到正数,对应颜色从蓝色变到黄色。
    我们在实际应用中常常将颜色通道的范围-100~+100或-128127之间。
    可视化
    可以看到,Lab*一共有三个分量,因此可以在三维空间中呈现。 在二维空间中,常用chromaticity diagram来可视化它,也就是固定亮度L,看a和b的变化。注意,这些可视化不是精确的,只是能帮助人理解。

    在这里插入图片描述
    LAB颜色模型

    是根据Commission International Eclairage(CIE)在1931年所制定的一种测定颜色的国际标准建立的。于1976年被改进,并且命名的一种色彩模式。Lab颜色模型弥补了RGB和CMYK两种色彩模式的不足。它是一种设备无关的颜色模型,也是一种基于生理特征的颜色模型。 Lab颜色模型由三个要素组成,一个要素是亮度(L),a 和b是两个颜色通道。a包括的颜色是从深绿色(低亮度值)到灰色(中亮度值)再到亮粉红色(高亮度值);b是从亮蓝色(低亮度值)到灰色(中亮度值)再到黄色(高亮度值)。因此,这种颜色混合后将产生具有明亮效果的色彩。

    Lab模式既不依赖光线,也不依赖于颜料,它是CIE组织确定的一个理论上包括了人眼可以看见的所有色彩的色彩模式。Lab模式弥补了RGB和CMYK两种色彩模式的不足。同RGB颜色空间相比,Lab是一种不常用的色彩空间。它是在1931年国际照明委员会(CIE)制定的颜色度量国际标准的基础上建立起来的。1976年,经修改后被正式命名为CIELab。它是一种设备无关的颜色系统,也是一种基于生理特征的颜色系统。这也就意味着,它是用数字化的方法来描述人的视觉感应。Lab颜色空间中的L分量用于表示像素的亮度,取值范围是[0,100],表示从纯黑到纯白;a表示从红色到绿色的范围,取值范围是[127,-128];b表示从黄色到蓝色的范围,取值范围是[127,-128]。下图所示为Lab颜色空间的图示;

    Lab颜色空间比计算机显示器甚至比人类视觉的色域都要大 ,表示为Lab的位图比RGB或CMYK位图获得同样的精度需要要求更多的像素数据。Lab模式所定义的色彩最多,且与光线及设备无关并且处理速度与RGB模式同样快,比CMYK模式快很多。因此,可以放心大胆的在图象编辑中使用Lab模 式。而且,Lab模式在转换成CMYK模式时色彩没有丢失或被替换。因此,最佳避免色彩损失的方法是:应用Lab模式编辑图象,再转换为CMYK模式打印 输出。

    #MicroPython动手做(08)——零基础学MaixPy之识别颜色

    #实验程序之一:find red blob 动态识别红色块

    尝试选择最佳的颜色跟踪阙值,通过滑动条来调节阈值,在二进制图像上红色块高亮(显示白色)。

    实测得出的LAB值为:55, 70, 42, 65, 52, 8

    在这里插入图片描述
    #MicroPython动手做(08)——零基础学MaixPy之识别颜色
    #实验程序之一:find red blob 动态识别红色块

    #MicroPython动手做(08)——零基础学MaixPy之识别颜色
    
    #实验程序:find red blob 动态识别红色块
    
     
    
    import sensor
    
    import image
    
    import lcd
    
    import time
    
     
    
    lcd.init(freq=15000000)
    
    sensor.reset()
    
    sensor.set_pixformat(sensor.RGB565)
    
    sensor.set_framesize(sensor.QVGA)
    
    sensor.run(1)
    
    red_threshold  = (55, 70, 42, 65, 52, 8) 
    
    while True:
    
        img=sensor.snapshot()
    
        blobs = img.find_blobs([green_threshold])
    
        if blobs:    
    
            for b in blobs:
    
                tmp=img.draw_rectangle(b[0:4]) 
    
                tmp=img.draw_cross(b[5], b[6]) 
    
                c=img.get_pixel(b[5], b[6])
    
        lcd.display(img)
    
    
    

    在这里插入图片描述
    做实验的魔方,有5种颜色

    在这里插入图片描述
    运行后可看到框圈和+号,已能准确识别
    在这里插入图片描述

    阴天里窗户前的实验场景
    在这里插入图片描述
    #MicroPython动手做(08)——零基础学MaixPy之识别颜色

    #实验程序之二:find green blob 动态识别绿色块

    获取绿色的LAB阙值为 0, 88, -42, -6, -9, 13
    在这里插入图片描述

    #MicroPython动手做(08)——零基础学MaixPy之识别颜色
    
    #实验程序之二:find green blob 动态识别绿色块
    
     
    
    import sensor
    
    import image
    
    import lcd
    
    import time
    
     
    
    lcd.init(freq=15000000)
    
    sensor.reset()
    
    sensor.set_pixformat(sensor.RGB565)
    
    sensor.set_framesize(sensor.QVGA)
    
    sensor.run(1)
    
    green_threshold  = (0, 88, -42, -6, -9, 13) 
    
    while True:
    
        img=sensor.snapshot()
    
        blobs = img.find_blobs([green_threshold])
    
        if blobs:    
    
            for b in blobs:
    
                tmp=img.draw_rectangle(b[0:4]) 
    
                tmp=img.draw_cross(b[5], b[6]) 
    
                c=img.get_pixel(b[5], b[6])
    
        lcd.display(img)
    
    
    

    在这里插入图片描述
    #MicroPython动手做(08)——零基础学MaixPy之识别颜色
    #实验程序之三:find orange blob 动态识别橙色块

    获取橙色的LAB阙值为 0, 80, 66, -20, 80, 50(与红色有交集)
    在这里插入图片描述

    #MicroPython动手做(08)——零基础学MaixPy之识别颜色
    
    #实验程序之三:find orange blob 动态识别橙色块
    
     
    
    import sensor
    
    import image
    
    import lcd
    
    import time
    
     
    
    lcd.init(freq=15000000)
    
     
    
    sensor.reset()
    
    sensor.set_pixformat(sensor.RGB565)
    
    sensor.set_framesize(sensor.QVGA)
    
    sensor.run(1)
    
     
    
    orange_threshold  = (0, 80, 66, -20, 80, 50)
    
     
    
    while True:
    
        img=sensor.snapshot()
    
        blobs = img.find_blobs([orange_threshold])
    
        if blobs:
    
            for b in blobs:
    
                tmp=img.draw_rectangle(b[0:4])
    
                tmp=img.draw_cross(b[5], b[6])
    
                c=img.get_pixel(b[5], b[6])
    
     
    
        lcd.display(img)
    
    
    

    在这里插入图片描述
    蓝色的LAB阙值为 0, 80, -128, 35, -128, -18

    在这里插入图片描述
    黄色的LAB阙值为 88, 95, 0, -44, 93, 48
    在这里插入图片描述
    说明:
    本实验案例以一只普通魔方的色彩为准(阴天光线),得出的实验数据(LAB阙值)仅供参考

    蓝色 (0, 80, -128, 35, -128, -18)
    红色 (55, 70, 42, 65, 52, 8)
    绿色 (0, 88, -42, -6, -9, 13)
    橙色 (0, 80, 66, -20, 80, 50)
    黄色 (88, 95, 0, -44, 93, 48)
    在这里插入图片描述
    #MicroPython动手做(08)——零基础学MaixPy之识别颜色

    #实验程序之四:识别图片上的红心和花心部分

    打开MaixPy IDE,选择工具——机器视觉——阕值编辑器——源图像位置——图像文件(识别电脑上的图片)

    细心调整六个滑动条的数值,参考结果见下图二进制图像

    识别红心和花心的LAB阙值为 (0, 80, 90, 24, 75, -10)
    在这里插入图片描述

    #MicroPython动手做(08)——零基础学MaixPy之识别颜色
    
    #实验程序之四:识别图片上的红心和花心部分
    
     
    
    import sensor
    
    import image
    
    import lcd
    
    import time
    
     
    
    lcd.init(freq=15000000)
    
     
    
    sensor.reset()
    
    sensor.set_pixformat(sensor.RGB565)
    
    sensor.set_framesize(sensor.QVGA)
    
    sensor.run(1)
    
     
    
    Five_threshold  = (0, 80, 90, 24, 75, -10)
    
     
    
    while True:
    
        img=sensor.snapshot()
    
        blobs = img.find_blobs([Five_threshold])
    
        if blobs:
    
            for b in blobs:
    
                tmp=img.draw_rectangle(b[0:4])
    
                tmp=img.draw_cross(b[5], b[6])
    
                c=img.get_pixel(b[5], b[6])
    
     
    
        lcd.display(img)
    

    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • 早上百度搜了一下“颜色识别”,多少有了一点大致的概念,还是老办法,动手做,多实验,往前走,还请各位老师多多指点。OpenCV(百度百科)是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux、...

    早上用百度搜了一下“颜色识别”,多少有了一点大致的概念,还是老办法,动手做,多实验,往前走,还请各位老师多多指点。

    OpenCV(百度百科)

    是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows、Android和Mac OS操作系统上。它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。OpenCV用C++语言编写,它的主要接口也是C++语言,但是依然保留了大量的C语言接口。该库也有大量的Python、Java and MATLAB/OCTAVE(版本2.5)的接口。这些语言的API接口函数可以通过在线文档获得。如今也提供对于C#、Ch、Ruby,GO的支持。

    OpenCV于1999年由Intel建立,如今由Willow Garage提供支持。OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows和Mac OS操作系统上。它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。OpenCV 拥有包括 500 多个C函数的跨平台的中、高层 API。它不依赖于其它的外部库——尽管也可以使用某些外部库。OpenCV 为Intel® Integrated Performance Primitives(IPP)提供了透明接口。这意味着如果有为特定处理器优化的 IPP 库,OpenCV 将在运行时自动加载这些库。 (注:OpenCV 2.0版的代码已显著优化,无需IPP来提升性能,故2.0版不再提供IPP接口)

    OpenCV概述

    其全称是Open source Computer Vision Library,开放源代码计算机视觉库。也就是说,它是一套关于计算机视觉的开放源代码的API函数库。这也就意味着:

    (1)不管是科学研究,还是商业应用,都可以利用它来作开发;

    (2)所有API函数的源代码都是公开的,你可以看到其内部实现的程序步骤;

    (3)你可以修改OpenCV的源代码,编译生成你需要的特定API函数。但是,作为一个库,它所提供的,仅仅是一些常用的,经典的,大众化的算法的API。

    一个典型的计算机视觉算法,应该包含以下一些步骤:

    (1)数据获取(对OpenCV来说,就是图片);

    (2)预处理;

    (3)特征提取;

    (4)特征选择;

    (5)分类器设计与训练;

    (6)分类判别;

    而OpenCV对这六个部分,分别(记住这个词)提供了API。

    基于OpenCV的颜色识别

    彩色模型

    数字图像处理中常用的采用模型是RGB(红,绿,蓝)模型和HSV(色调,饱和度,亮度),RGB广泛应用于彩色监视器和彩色视频摄像机,我们平时的图片一般都是RGB模型。而HSV模型更符合人描述和解释颜色的方式,HSV的彩色描述对人来说是自然且非常直观的。

    HSV模型

    HSV模型中颜色的参数分别是:色调(H:hue),饱和度(S:saturation),亮度(V:value)。由A. R. Smith在1978年创建的一种颜色空间, 也称六角锥体模型(Hexcone Model)。

    色调(H:hue):用角度度量,取值范围为0°~360°,从红色开始按逆时针方向计算,红色为0°,绿色为120°,蓝色为240°。它们的补色是:黄色为60°,青色为180°,品红为300°;

    饱和度(S:saturation):取值范围为0.0~1.0,值越大,颜色越饱和。

    亮度(V:value):取值范围为0(黑色)~255(白色)。

    RGB转成HSV

    设 (r, g, b) 分别是一个颜色的红、绿和蓝坐标,它们的值是在 0 到 1 之间的实数。设 max 等价于 r, g 和 b 中的最大者。设 min 等于这些值中的最小者。要找到在 HSV 空间中的 (h, s, v) 值,这里的 h ∈ [0, 360)是角度的色相角,而 s, v ∈ [0,1] 是饱和度和亮度。 OpenCV下有个函数可以直接将RGB模型转换为HSV模型,OpenCV中H∈ [0, 180), S ∈ [0, 255], V ∈ [0, 255]。我们知道H分量基本能表示一个物体的颜色,但是S和V的取值也要在一定范围内,因为S代表的是H所表示的那个颜色和白色的混合程度,也就说S越小,颜色越发白,也就是越浅;V代表的是H所表示的那个颜色和黑色的混合程度,也就说V越小,颜色越发黑。大致识别蓝色的取值是 H在100到140,S和V都在90到255之间。

    OpenCV颜色识别思路

    1、创建滑动条:用来调节阈值,识别出不同颜色。

    2、颜色空间转换:将RGB转换为HSV模型,于是可以通过不同颜色的HSV的阈值不同来识别出该种颜色。Opencv中使用cvtcolor()可实现。一般彩色图像都是RGB颜色空间,而HSV色彩空间模型是一种在人们生活中甚至更常用的颜色系统,在电视遥控器上、在画画的调色板中、在看电视时调整亮度时都很常见,因为它更符合人们描述颜色的方式——是什么颜色、颜色有多深、颜色有多亮。需要注意的是,在opencv中,H、S、V值范围分别是[0,180),[0,255),[0,255),而非实际模型[0,360],[0,1],[0,1]。

    3、直方图均衡化:由于光线的影响,手机读取的每一帧图片可能存在太亮或者太暗的问题,直方图均衡化可以将每个区间的像素点分布更均衡,使图像的层次感更强。Opencv中可以用equalizeHist()函数实现。直方图均衡化就是将原始的直方图拉伸,使之均匀分布在全部灰度范围内,从而增强图像的对比度。直方图均衡化的中心思想是把原始图像的的灰度直方图从比较集中的某个区域变成在全部灰度范围内的均匀分布

    4、二值化:将图像上的像素点的灰度值设置为0或255,这样将使整个图像呈现出明显的黑白效果。对灰度图像进行二值化处理,可以突出一定范围的信息。它是将像素点颜色值在所设定区间内(如a-b)的设定为255,在范围外的设为0.但是对于ab和的不同取值,二值化的效果会有很大的不同。

    5、开操作:用来去除图像中的噪点,即干扰信息。Opencv中可以使用getStructuringElement()函数来进行相应设置。开操作是基于图像的膨胀和腐蚀而言的,膨胀就是对图像高亮部分进行“领域扩张”,效果图拥有比原图更大的高亮区域;腐蚀是原图中的高亮区域被蚕食,效果图拥有比原图更小的高亮区域。而开操作是对图像先腐蚀再膨胀,用来消除小物体。其数学原理是定义一个卷积核B,将其与目标图像进行卷积,就可以达到相应效果。不同形状和大小的核会出现不同的效果。

    6、闭操作 :进行开操作之后可能会有一些断开的区域,闭操作可以将这些未联通的区域进行封闭,使图像更完整。闭操作是开操作的相反,先膨胀再腐蚀,用于排除小型黑洞,其原理与开操作相同。

    手头正好有个魔方,有五种颜色,就拿它当识别颜色的实验道具了。

    打开MaixPy IDE,选择工具——机器视觉——阕值编辑器

    打开源图像位置,选择帧缓冲区

    调整LAB阕值,主要是在二进制图像栏,白色像素是被跟踪的像素

    彻底搞懂Lab 颜色空间

    名称

    在开始之前,先明确一下Lab颜色空间(Lab color space)的名字:

    Lab的全称是CIELAB,有时候也写成CIE Lab*

    这里的CIE代表International Commission on Illumination(国际照明委员会),它是一个关于光照、颜色等的国际权威组织。

    通道

    Lab是由一个亮度通道(channel)和两个颜色通道组成的。在Lab颜色空间中,每个颜色用L、a、b三个数字表示,各个分量的含义是这样的:

    L*代表亮度

    a*代表从绿色到红色的分量

    b*代表从蓝色到黄色的分量

    Perceptual uniform

    Lab是基于人对颜色的感觉来设计的,更具体地说,它是感知均匀(perceptual uniform)的。Perceptual uniform的意思是,如果数字(即前面提到的L、a、b这三个数)变化的幅度一样,那么它给人带来视觉上的变化幅度也差不多。Lab相较于RGB与CMYK等颜色空间更符合人类视觉,也更容易调整:想要调节亮度(不考虑Helmholtz–Kohlrausch effect,见下注)就调节L通道,想要调节只色彩平衡就分别调a和b。

    注:Helmholtz–Kohlrausch effect是人眼的一种错觉——当色彩饱和度高时,颜色会看起来更亮。

    设备无关

    Lab有个很好的特性——设备无关(device-independent)。也就是说,在给定了颜色空间白点(white point)(下图中表示了一种颜色空间的白点)之后,这个颜色空间就能明确地确定各个颜色是如何被创建和显示的,与使用的显示介质没有关系。 需要注意的是,Lab定义的是相对于白点的颜色,只有定义完白点是什么颜色(比如定义为CIE standard illuminant D50),我们才能知道其他的颜色。

    数值范围

    理论上说,L、a、b*都是实数,不过实际一般限定在一个整数范围内:

    L越大,亮度越高。L为0时代表黑色,为100时代表白色。

    a和b为0时都代表灰色。

    a*从负数变到正数,对应颜色从绿色变到红色。

    b*从负数变到正数,对应颜色从蓝色变到黄色。

    我们在实际应用中常常将颜色通道的范围-100~+100或-128127之间。

    可视化

    可以看到,Lab*一共有三个分量,因此可以在三维空间中呈现。 在二维空间中,常用chromaticity diagram来可视化它,也就是固定亮度L,看a和b的变化。注意,这些可视化不是精确的,只是能帮助人理解。

    LAB颜色模型

    是根据Commission International Eclairage(CIE)在1931年所制定的一种测定颜色的国际标准建立的。于1976年被改进,并且命名的一种色彩模式。Lab颜色模型弥补了RGB和CMYK两种色彩模式的不足。它是一种设备无关的颜色模型,也是一种基于生理特征的颜色模型。 Lab颜色模型由三个要素组成,一个要素是亮度(L),a 和b是两个颜色通道。a包括的颜色是从深绿色(低亮度值)到灰色(中亮度值)再到亮粉红色(高亮度值);b是从亮蓝色(低亮度值)到灰色(中亮度值)再到黄色(高亮度值)。因此,这种颜色混合后将产生具有明亮效果的色彩。

    Lab模式既不依赖光线,也不依赖于颜料,它是CIE组织确定的一个理论上包括了人眼可以看见的所有色彩的色彩模式。Lab模式弥补了RGB和CMYK两种色彩模式的不足。同RGB颜色空间相比,Lab是一种不常用的色彩空间。它是在1931年国际照明委员会(CIE)制定的颜色度量国际标准的基础上建立起来的。1976年,经修改后被正式命名为CIELab。它是一种设备无关的颜色系统,也是一种基于生理特征的颜色系统。这也就意味着,它是用数字化的方法来描述人的视觉感应。Lab颜色空间中的L分量用于表示像素的亮度,取值范围是[0,100],表示从纯黑到纯白;a表示从红色到绿色的范围,取值范围是[127,-128];b表示从黄色到蓝色的范围,取值范围是[127,-128]。下图所示为Lab颜色空间的图示;

    Lab颜色空间比计算机显示器甚至比人类视觉的色域都要大  ,表示为Lab的位图比RGB或CMYK位图获得同样的精度需要要求更多的像素数据。Lab模式所定义的色彩最多,且与光线及设备无关并且处理速度与RGB模式同样快,比CMYK模式快很多。因此,可以放心大胆的在图象编辑中使用Lab模 式。而且,Lab模式在转换成CMYK模式时色彩没有丢失或被替换。因此,最佳避免色彩损失的方法是:应用Lab模式编辑图象,再转换为CMYK模式打印 输出。

    #MicroPython动手做(08)——零基础学MaixPy之识别颜色

    #实验程序之一:find red blob 动态识别红色块

    尝试选择最佳的颜色跟踪阙值,通过滑动条来调节阈值,在二进制图像上红色块高亮(显示白色)。

    实测得出的LAB值为:55, 70, 42, 65, 52, 8

    #MicroPython动手做(08)——零基础学MaixPy之识别颜色

    #实验程序之一:find red blob 动态识别红色块

    #MicroPython动手做(08)——零基础学MaixPy之识别颜色

    #实验程序:find red blob 动态识别红色块

    import sensor

    import image

    import lcd

    import time

    lcd.init(freq=15000000)

    sensor.reset()

    sensor.set_pixformat(sensor.RGB565)

    sensor.set_framesize(sensor.QVGA)

    sensor.run(1)

    red_threshold = (55, 70, 42, 65, 52, 8)

    while True:

    img=sensor.snapshot()

    blobs = img.find_blobs([green_threshold])

    if blobs:

    for b in blobs:

    tmp=img.draw_rectangle(b[0:4])

    tmp=img.draw_cross(b[5], b[6])

    c=img.get_pixel(b[5], b[6])

    lcd.display(img)

    做实验的魔方,有5种颜色

    运行后可看到框圈和+号,已能准确识别

    阴天里窗户前的实验场景

    #MicroPython动手做(08)——零基础学MaixPy之识别颜色

    #实验程序之二:find green blob 动态识别绿色块

    获取绿色的LAB阙值为 0, 88, -42, -6, -9, 13

    #MicroPython动手做(08)——零基础学MaixPy之识别颜色

    #实验程序之二:find green blob 动态识别绿色块

    import sensor

    import image

    import lcd

    import time

    lcd.init(freq=15000000)

    sensor.reset()

    sensor.set_pixformat(sensor.RGB565)

    sensor.set_framesize(sensor.QVGA)

    sensor.run(1)

    green_threshold = (0, 88, -42, -6, -9, 13)

    while True:

    img=sensor.snapshot()

    blobs = img.find_blobs([green_threshold])

    if blobs:

    for b in blobs:

    tmp=img.draw_rectangle(b[0:4])

    tmp=img.draw_cross(b[5], b[6])

    c=img.get_pixel(b[5], b[6])

    lcd.display(img)

    #MicroPython动手做(08)——零基础学MaixPy之识别颜色

    #实验程序之三:find orange blob 动态识别橙色块

    获取橙色的LAB阙值为 0, 80, 66, -20, 80, 50(与红色有交集)

    #MicroPython动手做(08)——零基础学MaixPy之识别颜色

    #实验程序之三:find orange blob 动态识别橙色块

    import sensor

    import image

    import lcd

    import time

    lcd.init(freq=15000000)

    sensor.reset()

    sensor.set_pixformat(sensor.RGB565)

    sensor.set_framesize(sensor.QVGA)

    sensor.run(1)

    orange_threshold = (0, 80, 66, -20, 80, 50)

    while True:

    img=sensor.snapshot()

    blobs = img.find_blobs([orange_threshold])

    if blobs:

    for b in blobs:

    tmp=img.draw_rectangle(b[0:4])

    tmp=img.draw_cross(b[5], b[6])

    c=img.get_pixel(b[5], b[6])

    lcd.display(img)

    蓝色的LAB阙值为 0, 80, -128, 35, -128, -18

    黄色的LAB阙值为 88, 95, 0, -44, 93, 48

    说明:

    本实验案例以一只普通魔方的色彩为准(阴天光线),得出的实验数据(LAB阙值)仅供参考

    蓝色 (0, 80, -128, 35, -128, -18)

    红色 (55, 70, 42, 65, 52, 8)

    绿色 (0, 88, -42, -6, -9, 13)

    橙色 (0, 80, 66, -20, 80, 50)

    黄色 (88, 95, 0, -44, 93, 48)

    #MicroPython动手做(08)——零基础学MaixPy之识别颜色

    #实验程序之四:识别图片上的红心和花心部分

    打开MaixPy IDE,选择工具——机器视觉——阕值编辑器——源图像位置——图像文件(识别电脑上的图片)

    细心调整六个滑动条的数值,参考结果见下图二进制图像

    识别红心和花心的LAB阙值为 (0, 80, 90, 24, 75, -10)

    #MicroPython动手做(08)——零基础学MaixPy之识别颜色

    #实验程序之四:识别图片上的红心和花心部分

    import sensor

    import image

    import lcd

    import time

    lcd.init(freq=15000000)

    sensor.reset()

    sensor.set_pixformat(sensor.RGB565)

    sensor.set_framesize(sensor.QVGA)

    sensor.run(1)

    Five_threshold = (0, 80, 90, 24, 75, -10)

    while True:

    img=sensor.snapshot()

    blobs = img.find_blobs([Five_threshold])

    if blobs:

    for b in blobs:

    tmp=img.draw_rectangle(b[0:4])

    tmp=img.draw_cross(b[5], b[6])

    c=img.get_pixel(b[5], b[6])

    lcd.display(img)

    展开全文
  • 但是office系列软件还是windows系统兼容性更佳,萌萌决心把所有编程环境安装在Mac系统下,其余的办公软件安装在windows里,来看论文和老师的ppt,于是想安装一个虚拟机。 虚拟机的选择有很多,萌萌的是官网...

    萌萌用崩了自己的联想yoga,现在换了MacBookPro用来工作和学习。但是office系列软件还是和windows系统兼容性更佳,萌萌决心把所有编程环境安装在Mac系统下,其余的办公软件安装在windows里,用来看论文和老师的ppt,于是想安装一个虚拟机。
    虚拟机的选择有很多,萌萌用的是官网下载的VirtualBox
    划重点,官网的!
    在这里插入图片描述

    下载完成后,傻瓜安装。
    同时要准备win10系统镜像文件,一定要用纯净的iso镜像文件,不能用Ghost版镜像文件,如果用了Ghost镜像文件将会出现致命错误,如图。
    错误原因是启动文件出现错误,导致系统被挂起。
    致命错误,启动文件错误,系统被挂起
    错误内容:FATAL:No bootable medium found!System halted.
    因为这个错误萌萌换了大概三个系统镜像文件,所以这里直接推荐最后一个能用的MSDN网页。 在这里插入图片描述
    选择需要的系统后,进入详细信息界面,在文件名文件大小的下一行是下载地址,复制后打开迅雷直接下载。
    迅雷另外自己下载吧,很快,比网盘好使,下载速度能达到20MB,还不是vip会员的下载速度惊到萌萌了。
    下载之后文件长这样
    在这里插入图片描述
    文件名如图,这个可以用。然后进入新建虚拟机的环节。简直令人 崩溃。
    在这里插入图片描述
    选择系统,起个自己认识的名字,一步一步创建。
    换了一个文件名哈哈哈,因为萌萌已经有一个win10虚拟机了名字重复了
    在这里插入图片描述
    选择启动文件,启动文件很重要很重要!
    在这里插入图片描述
    成功!接下来就是进行一系列个人设置,设置好了就可以进行使用了!在这里插入图片描述 萌萌找了很多教程,出现了很多问题,最后总结成为这一篇自己截屏自己操作最终获得自己想要的结果的博客。应该说会和很多教程有相出入的地方,因为萌萌就是借鉴大家的教程做出来的。用博客来记录一下这两天的问题以及解决过程,是提升自己的重要一步嘛! 希望csdn这个大家庭,能见证萌萌的成长!

    展开全文
  • qt编程实现的简易记事本(范例)

    万次阅读 多人点赞 2012-11-23 18:05:52
    Qt是一种跨平台的原生开发框架,面向所有主要的操作系统,...本人也是刚接触qt编程,觉得qt相对其他语言来说起来还是比较容易的。  这是我Qt Creator实现的简易记事本: 上面界面是Qt Designer实现的 是不是
         Qt是一种跨平台的原生开发框架,面向所有主要的操作系统,包括Linux、Windows、Mac、Symbian和Maemo。本文介绍的是在Windows下用qt编程实现的简易记事本,有兴趣学习qt编程的可以看看。本人也是刚接触qt编程,觉得qt相对其他语言来说学起来还是比较容易的。
      这是我用Qt Creator实现的简易记事本:QQ迷你版 本地网络聊天软件详见Qt编程—我的QQ(局域网可用)—含源代码
    上面界面是用Qt  Designer实现的
    是不是在actionNew(新建)前面有出现小图标,在往工具栏里移动,就出现上述效果了。
     
            这只是实现了一部分功能,大家可以看一下
    mainwindow.h文件
    <span style="font-size:14px;">#ifndef MAINWINDOW_H
    #define MAINWINDOW_H
    
    #include <QMainWindow>
    #include <QFileDialog>
    #include <QTextStream>
    #include <QMessageBox>
    #include <QDialog>
    #include <QLineEdit>
    #include <QPushButton>
    #include <QVBoxLayout>
    #include <QHBoxLayout>
    
    namespace Ui {
        class MainWindow;
    }
    
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
    
    public:
        explicit MainWindow(QWidget *parent = 0);
        ~MainWindow();
        void changeTitle(const QString &filename);
        void openfile(const QString &filename);
        void savefile(const QString &filename);
    
    
    private:
        Ui::MainWindow *ui;
        QString curFile;
        QLineEdit *find_textLineEdit;
    
    private slots:
        void show_findText();
        void on_action_2_triggered();//查找
        void on_plan_textEdit_copyAvailable(bool b);
        void on_plan_textEdit_textChanged();
        void on_action_U_triggered();//撤销
        void on_action_P_triggered();//粘贴
        void on_action_C_triggered();//复制
        void on_action_T_triggered();//剪切
        void on_actionExit_triggered();//退出
        bool on_actionSave_triggered();//保存
        bool on_actionSave_As_triggered();//另存为
        void on_actionOpen_triggered();//打开
        void on_actionNew_triggered();//新建
    };
    
    #endif // MAINWINDOW_H
    </span>

    main.h文件
    <span style="font-size:14px;">#include <QtGui/QApplication>
    #include <QTextCodec>
    #include "mainwindow.h"
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
    
        QTextCodec::setCodecForCStrings(QTextCodec::codecForName("GB2312"));
        QTextCodec::setCodecForLocale(QTextCodec::codecForName("GB2312"));
        QTextCodec::setCodecForTr(QTextCodec::codecForName("GB2312"));
    
    
        MainWindow w;
        w.show();
    
        return a.exec();
    }
    </span>

    mainwindow.cpp
    <span style="font-size:14px;">#include "mainwindow.h"
    #include "ui_mainwindow.h"
    #include<QDebug>
    
    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
        this->changeTitle("");
        this->setCentralWidget(ui->plan_textEdit);
        //设置action的属性
        ui->action_T->setEnabled(false);
        ui->action_C->setEnabled(false);
        //设置界面图标
      this->setWindowIcon(QIcon(":/images/editor.png"));
    }
    
    MainWindow::~MainWindow()
    {
        delete ui;
    }
    
    void MainWindow::savefile(const QString &filename)
    {
        QFile file(filename);
        if(!file.open(QIODevice::WriteOnly | QIODevice::Text)){
            QMessageBox::warning(this, "Save",
                                 tr("Save , error ?")
                                 .arg(filename)
                                .arg(file.errorString()));
            return ;
        }
        QTextStream out(&file);
        out << ui->plan_textEdit->toPlainText();
        file.close();
    }
    
    void MainWindow::openfile(const QString &filename)
    {
        QFile file(filename);
        if(file.open(QIODevice::ReadOnly | QIODevice::Text)){
            QMessageBox::warning(this, "Open",
                                 tr("Save , error ?")
                                 .arg(filename)
                                 .arg(file.errorString()));
            return ;
        }
        QTextStream in(&file);
        QString s=in.readAll();
        ui->plan_textEdit->setPlainText(s);
    }
    void MainWindow::changeTitle(const QString &filename)
    {
        qDebug()<<"***"<<filename;
        if(filename.isEmpty()){
             this->curFile = "";
             this->setWindowTitle(tr("无标题.txt[*]--记事本"));
        }
        else{
            this->curFile = filename;
            QFileInfo fi(filename);
            QString name=fi.fileName();
            this->setWindowTitle(tr("%1[*]--记事本").arg(name));
            qDebug()<<"===="<<name;
        }
        this->setWindowModified(false);
        ui->plan_textEdit->document()->setModified(false);
    }
    
    void MainWindow::on_actionNew_triggered()//新建
    {
        QTextDocument *document=ui->plan_textEdit->document();
        if(!document->isModified()){
            ui->plan_textEdit->setPlainText("");
            this->changeTitle("");
            return ;
        }
        int ret=QMessageBox::question(this, "Save?",
                                      "disSave, Save",
                                      QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel);
        switch(ret)
        {
        case QMessageBox::Cancel:
    
            break;
        case QMessageBox::Discard:
            ui->plan_textEdit->setPlainText("");
            this->changeTitle("");
            break;
        case QMessageBox::Save:
              if(!on_actionSave_triggered())
                     return ;
              ui->plan_textEdit->setPlainText("");
              this->changeTitle("");
              break;
             }
    
    }
    
    void MainWindow::on_actionOpen_triggered()//打开
    {
        QTextDocument *document=ui->plan_textEdit->document();
        if(document->isModified()){
            int ret=QMessageBox::question(this, "Save?",
                                          "disSave, Save",
                                          QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel);
            if(ret==QMessageBox::Cancel){
                return ;
            }
            else if(ret==QMessageBox::Save){
    
            }
        }
        //没修改    正常保存    放弃保存
        QString filename=QFileDialog::getOpenFileName(this);
        if(filename.isEmpty())
            return ;
        this->openfile(filename);
        this->changeTitle(filename);
    }
    
    bool MainWindow::on_actionSave_As_triggered()//另存为
    {
        QString fileName=QFileDialog::getSaveFileName(this,tr("Save File"));
        if(fileName.isEmpty())
            return false;
        this->savefile(fileName);
        this->changeTitle(fileName);
        return true;
    }
    
    
    bool MainWindow::on_actionSave_triggered()//保存
    {
        if(this->curFile.isEmpty())
         // qDebug()<<"+++";
                return on_actionSave_As_triggered();
    
        else
        {
            savefile(this->curFile);
          this->setWindowModified(false);
        }
        return true;
    }
    
    void MainWindow::on_actionExit_triggered()//退出
    {
        this->close();
    }
    
    void MainWindow::on_action_T_triggered()//剪切
    {
        this->ui->plan_textEdit->cut();
    }
    
    void MainWindow::on_action_C_triggered()//复制
    {
        this->ui->plan_textEdit->copy();
    }
    
    void MainWindow::on_action_P_triggered()//粘贴
    {
        this->ui->plan_textEdit->paste();
    }
    
    
    void MainWindow::on_action_U_triggered()//撤销
    {
       this->ui->plan_textEdit->undo();
    }
    
    void MainWindow::on_plan_textEdit_textChanged()
    {
        //qDebug()<<"niaho";
        this->setWindowModified(true);
    }
    
    void MainWindow::on_plan_textEdit_copyAvailable(bool b)
    {
        ui->action_T->setEnabled(b);
        ui->action_C->setEnabled(b);
    
    }
    //这部分是编码实现的,可以看看与界面设计实现的有什么不一样
    void MainWindow::on_action_2_triggered()//查找
    {
       QDialog *findDlg=new QDialog(this);
       findDlg->setWindowTitle(tr("Find!"));
       find_textLineEdit=new QLineEdit(findDlg);
       QPushButton *find_Bth=new QPushButton(tr("查找下一个"),findDlg);
    
       QHBoxLayout *layout=new QHBoxLayout(findDlg);
       layout->addWidget(find_textLineEdit);
       layout->addWidget(find_Bth);
    
       findDlg->show();
    
       connect(find_Bth,SIGNAL(clicked()),this,SLOT(show_findText()));
    }
    void MainWindow::show_findText()
    {
        QString findText=find_textLineEdit->text();
        if(!ui->plan_textEdit->find(findText,QTextDocument::FindBackward))
        {
            QMessageBox::warning(this,tr("查找"),tr("找不到 %1").arg(findText));
        }
    }
    </span>

    其实还有一部分功能没实现,有兴趣的话可以关注我下一篇文章。
    展开全文
  • 其解释器可在Windows、Linux 和 Mac OS 等多种操作系统上使用。它的可移植性和可伸缩性等特性使得它更加容易被运用。Python 库可用于以下用途:Web 开发数据科学机器学习多媒体软件开发像 Django 这样的 Web 框架GUI...
  • Android高级编程--源代码

    热门讨论 2013-02-06 17:39:21
    不管是经验丰富的移动开发人员,还是初出茅庐的新手,都能从本书提供的宝贵信息中获益。 作译者  Reto Meier出生于澳大利西南的珀斯市,现居伦敦。 Reto是一位经验丰富的软件开发人员,拥有逾10年的GUI程序架构、...
  • 写代码,我建议还是用 Mac 吧。几个原因:macOS 作为 Mac 的操作系统,使用流畅、稳定,熟悉之后爱不释手。我几乎不关机,随时跑代码,系统几乎不会变慢。Mac 搭建编程环境方便。我本人 anaconda 搭建 python 环境...
  • 第1-3章 ...因为我在Mac的一个叫Jupiter Notebook的网页端界面,所以就省去了这个步骤,直接进行后面的练习了,当然后面到小项目的时候也许还是需要熟练的在Windows、MacOS、Linux三个不同环境下搭...
  • Android高级编程--详细书签版

    热门讨论 2013-02-06 17:37:52
    不管是经验丰富的移动开发人员,还是初出茅庐的新手,都能从本书提供的宝贵信息中获益。 作译者  Reto Meier出生于澳大利西南的珀斯市,现居伦敦。 Reto是一位经验丰富的软件开发人员,拥有逾10年的GUI程序架构、...
  • Delphi具有以下的特性:基于窗体和面向对象的方法,高速的编译器,强大的数据库支持,与Windows编程紧密结合,强大而成熟的组件技术。但最重要的还是Object Pascal语言,它才是一切的根本。 Object Pascal语言是在...
  • 学习VI和VIM编辑器第7版中文

    热门讨论 2012-07-11 15:24:59
    Vim现在是大多数Linux系统上的默认编辑器,也是Mac OS X的默认vi版 本,同时能在许多其他操作系统上执行。《学习vi和Vim编辑器(中文版第7 版)》将说明使用这两种程序编辑文档的基础技巧,并讨论高级工具,例如 交互...
  • 其解释器可在Windows、 Linux 和 Mac OS 等多种操作系统上使用。它的可移植性和可伸缩性等特性使得它更加容易被运用。Python 库可用于以下用途:Web 开发数据科学机器学习多媒体软件开发像 Django 这样的 Web 框架...
  •  vim现在是大多数linux系统上的默认编辑器,也是mac os x的默认vi版本,同时能在许多其他操作系统上执行。《学习vi和vim编辑器(第7版)》将说明使用这两种程序编辑文档的基础技巧,并讨论高级工具,例如交互式宏与...
  • 首先呢,小伙伴们需要准备一下一台电脑,不论是WindowsMac OS还是Linux都可以Python的安装包,小伙伴们可以通过其官方网站下载如果你喜欢记笔记,可以准备一个小本本,把我们的知识点记录下来以备后续复习。...
  • Deepin的Ubuntu系统无线USB网卡解决

    千次阅读 2016-10-12 14:13:22
    怪不得有人说,要学编程,要买Macwindows干扰真是太多了。言归正传,我的台式机原来的mercury mw300um无线USB网卡不支持linux,于是只好扯网线,并在网上搜解决方案。有人搞什么查芯片自己写驱动…对于我这样的...
  • 而且对于我这些正在学习编程的新手来说,windows的开发环境不是太友好 Mac OS当然比windows好.稳定,对开发兼容性好.但一台苹果的电脑价钱还是小贵的.经过了综合考虑,就决定安装Linux的系统,开源而且免费.  ...
  • ios学习笔记连载一

    2015-07-16 13:33:54
    7月8日来到北京,还是第一次来到北京,7月10日北京无限互联ios47班正式... 使用了三年早已熟悉的windows系统换成了mac系统,习惯了java开发的eclipse也换成了ios开发的Xcode,每次细节中都凸现不同。虽然的还不熟练
  • objective-C在XCode入门Cocoa框架

    千次阅读 2018-08-10 10:57:32
    因为最近项目需要,必须得学习Mac开发...但是有一些老的项目还是用OC编写的,以及一些开源项目也是OC编写的。而我要上手的项目就是一个开源项目,是objective-c写的。因此即使喜欢swift,也必须得objective-C...
  • Sublime Text 2 插件

    2013-12-17 10:53:00
    一直以来写代码都是的EditPlus,也尝试了一段时间学习Vim这神器,后来因为... Sublime Text 2,它绿色小巧并且速度非常快,携带方便,跨平台支持Windows/MAC/linux,支持32位和64位系统,支持各种编程语言的语法...
  • Python 数据分析基础

    2018-09-18 09:30:06
    想深入应用手中的数据?还是想在上千份文件上重复同样的分析过程?没有编程经验的非程序员们如何能在最短的时间内学会当今炙手可热的Python语言进行数据分析?...在WindowsMac环境下按计划自动运行脚本
  • 当被问及“我应该使用什么操作系统,Windows,Unix或Mac?”时,我的回答通常是:“使用你朋友使用的任何东西”。从朋友的学习中获得的优势将抵消操作系统之间或编程语言之间的内在差异。还要考虑你的未来的朋友:...
  • 但这里做个说明,因为之前写的时候的是 windows 电脑,现在 mac ,所以有些例子是 windows 的截图,有些是 mac 的截图,不要觉得奇怪。 主要目录如下: 为什么Python? Python代码规范 简明概述 注释 命名...
  • IntelliJ IDEA Ultimate Edition 2018.3.3:IntelliJ IDEA for mac是一个综合性的Java编程环境,被许多开发人员和行业专家誉为市场上最好的IDE,下载地址及激活方法:https://xclient.info/s/intellij-idea.html ...
  • Google Java编程风格指南中文版 Android Developers 国内镜像站 Android Api中文版 Android Proguard混淆配置指南 Gradle插件使用指南中文版 Gradle User Guide Tutorials Android学习之路 Google Android官方...
  • matplotlib使用(建议还是学下seaborn) 自己的笔记,凑合看下吧,有些我觉得没太重要的就没记上去(也包括Matplotlib的那一部分) 推荐B站上的一个up主的视频,莫烦·Matplotlib中文视频教程——基于python3,看...
  • 2.2 Windows开发环境搭建 8 2.2.1 JDK、Eclipse、Android SDK软件安装 8 2.2.2 SDK的家在哪里——设定Android SDK Home 14 2.2.3 真的准备好了吗——开发环境验证 14 2.2.4 创建Android虚拟设备(AVD) 15 2.3 ...
  • Python 2.5

    2007-05-28 12:33:42
    最后,Python的可移植度非常高:它可以在许多的Unix类平台上运行,在Mac,MS-DOS,视窗WindowsWindows NT,OS/2,BeOS,以至RISCOS上都有相关的Python版本。 <br/> <br/>Python核心网站是: ...
  • 同时,无论插入还是擦除,其都能始终保持指向未擦除元素的永久指针。 dynamic_bitset:C++17 的动态位集合,只有头文件。 Forest:实现了AVL、二进制搜索、KD和四叉树的模板库。 Hashmaps: C++中开放寻址哈希表...

空空如也

空空如也

1 2
收藏数 35
精华内容 14
关键字:

学编程用windows还是mac