精华内容
下载资源
问答
  • Jetson TX1内核kernel编译与烧写

    千次阅读 2017-09-14 14:00:23
    Jetson tx1内核kernel的编译和烧写

    Data: 2017.09.13

    Author: cjh

    Theme: Jetson TX1内核kernel编译与烧写

    PS   :本人用的JetPack版本为3.0

     

    1.      Getting bootloader and kernel

    本文内核kernel源码是通过JetPack进行安装的,如果没安装的请首先下载JetPack。

    通过运行以下命令可获得源码

    cd/home/$USER/JetPack-L4T-3.0/64_TX1/Linux_for_Tegra_64_tx1

    ./source_sync.sh

     

    下载源码需要时间

    Use: source_sync.sh [options]

    Available general options are,

        -h     :     help

        -e     : exit on sync error

        -d DIR : root of source is DIR

    默认情况下会下载所有的源码

    如果用到了一个或多个以下选项,则仅下载指定的源。

     

        -k [TAG]: Download kernel source and optionally sync to TAG

        -u [TAG]: Download u-boot source and optionally sync to TAG

     

    PS:DEVDIR为JetPack的安装目录,可用export DEVDIR = /    添加临时环境变量

     

    cd $ DEVDIR / 64_TX1 /Linux_for_Tegra_64_tx1 / sources / kernel_source

    git branch -a

    git checkout l4t / l4t-r24.2

     

    cd $ DEVDIR / 64_TX1 /Linux_for_Tegra_64_tx1 / sources / u-boot_source

    git branch -a

    git checkout l4t / l4t-r24.2

     

    此时源码下载完成

     

    2.      安装Toolchain

    下载:

    5.3-2016.02 for 64bits PC - 64bits ARM

    5.3-2016.02 for 64bits PC - 32bits ARM

     

    安装:

    sudo mkdir /opt/linaro

    sudo chmod -R 775 /opt/linaro

    sudo chown -R $USER /opt/linaro

    cpgcc-linaro-5.3-2016.02-x86_64_aarch64-linux-gnu.tar.xz /opt/linaro

    cpgcc-linaro-5.3-2016.02-x86_64_arm-linux-gnueabihf.tar.xz /opt/linaro

    cd /opt/linaro/

    tar -xfgcc-linaro-5.3-2016.02-x86_64_aarch64-linux-gnu.tar.xz

    tar -xfgcc-linaro-5.3-2016.02-x86_64_arm-linux-gnueabihf.tar.xz

     

    PS:USER为当前用户

     

    3.      内核编译

    1) 指定工具链的路径:

    mkdir -p $DEVDIR/images/modules

    mkdir -p $DEVDIR/images/packages

    export CROSS_COMPILE=/opt/linaro/gcc-linaro-5.3-2016.02-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-

    exportCROSS32CC=/opt/linaro/gcc-linaro-5.3-2016.02-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc

    exportKERNEL_MODULES_OUT=$DEVDIR/images/modules

    export ARCH=arm64

     

    2) 清理内核和配置

    cd$DEVDIR/64_TX1/Linux_for_Tegra_64_tx1/sources/kernel_source/

    make mrproper

     

    PS:为避免错误

        error: r7 cannot beused in asm here

    error: logical not is only applied to the left hand side ofcomparison

    分别修改一下代码:

     

    目录:kernel_source/arch/arm64/kernel/vdso32/Makefile

     

    GCOV_PROFILE := n

     

    注释:ccflags-y := -shared -fPIC-fno-common -fno-builtin -march=armv7-a

    增加:ccflags-y := -shared -fPIC-fomit-frame-pointer -fno-common -fno-builtin -march=armv7-a

     ccflags-y += -nostdlib -Wl,-soname=linux-vdso32.so.1\

                    $(call cc-ldoption,-Wl$(comma)--hash-style=sysv)

     asflags-y := -D__VDSO32__ -s

     

    目录:kernel_source/drivers/platform/tegra/tegra21_clocks.c

     

    static void tegra21_cpu_clk_init(struct clk*c)

     {

    注释:       c->state = (!is_lp_cluster() ==(c->u.cpu.mode == MODE_G)) ? ON : OFF;

    增加:       c->state = ((!is_lp_cluster()) ==(c->u.cpu.mode == MODE_G)) ? ON : OFF;

     }

     

     static int tegra21_cpu_clk_enable(struct clk*c)

     

    3) 配置你的内核

    make tegra21_defconfig

    make menuconfig

     

    PS:错误解决

    *** Unable to find thencurses libraries or the

    *** required headerfiles.

    *** 'make menuconfig'requires the ncurses libraries.

    ***

    *** Install ncurses(ncurses-devel) and try again.

    方法:sudo apt-get installlibncurses5-dev

     

    4) 编译内核,设备树和模块

    make zImage

    make dtbs

    make modules

    make modules_installINSTALL_MOD_PATH=$KERNEL_MODULES_OUT

     

    PS:错误解决

    GEN   config-host.h

         LEX convert-dtsv0-lexer.lex.c

    make[1]: flex:命令未找到

         BISON dtc-parser.tab.c

    make[1]: bison:命令未找到

         LEX dtc-lexer.lex.c

    make[1]: flex:命令未找到

    CHK version_gen.h

    方法:sudo apt-get install flex

         sudo apt-get install bison

     

    5) 后期准备,修改JetPack

    将您的二进制文件保存在images目录中

    cp arch/arm64/boot/Imagearch/arm64/boot/zImage $DEVDIR/images/

    用kernel模块创建kernel_supplements.tbz2,Jetpack需要这个包

    cd $DEVDIR/images/modules/lib/modules/

    ls .

    使用modules目录的名称定义一个变量

    export KERNEL_MODULES_NAME=3.10.96+

    修复内核模块目录上的符号链接

    cd$DEVDIR/images/modules/lib/modules/$KERNEL_MODULES_NAME

    rm build source

    创建tarball

    cd $DEVDIR/images/modules/

    tar -cjf kernel_supplements.tbz2 *

    mv kernel_supplements.tbz2$DEVDIR/images/packages

    除了创建模块和内核映像之外,还需要再次创建您的kernel_headers.tbz2文件(Jetpack需要)。 默认情况下,当您修补内核代码时,您不会检查内核中的更改将为发行版本添加一个后缀(例如,检查ls $ DEVDIR / images / modules / lib / modules /)。因为这个特定的原因,你需要生成你的头文件tarball再次更改它的版本。

    cd $DEVDIR/64_TX1/Linux_for_Tegra_64_tx1/kernel

    tar -xf kernel_headers.tbz2

    tar -cjf kernel_headers_custom.tbz2linux-headers-$KERNEL_MODULES_NAME

    mv kernel_headers_custom.tbz2$DEVDIR/images/packages

    rm -rf linux-headers-$KERNEL_MODULES_NAME

     

    PS:KERNEL_MODULES_NAME这个后缀大家见机修改

     

    创建dtb目录

    mkdir -p $DEVDIR/images/dtb

    cp$DEVDIR/64_TX1/Linux_for_Tegra_64_tx1/sources/kernel_source/arch/arm64/boot/dts/*.dtb$DEVDIR/images/dtb/

     

    复制设备树编译器(DTC)

    cp$DEVDIR/64_TX1/Linux_for_Tegra_64_tx1/sources/kernel_source/scripts/dtc/dtc$DEVDIR/images/dtc

     

    创建Jetpack中包含的图像和软件包的备份

    mkdir -p $DEVDIR/images/packages-backup

    cp -rf$DEVDIR/64_TX1/Linux_for_Tegra_64_tx1/kernel/* $DEVDIR/images/packages-backup

     

    最后使用自己的图像覆盖默认图像,以使用jetpack安装和引导它们

    cd $ DEVDIR / images

    cd $DEVDIR/images

    rm -rf $DEVDIR/64_TX1/Linux_for_Tegra_64_tx1/kernel/dtb

    cp -rf Image zImagepackages/kernel_supplements.tbz2 dtb/ dtc$DEVDIR/64_TX1/Linux_for_Tegra_64_tx1/kernel/

    cp -rf packages/kernel_headers_custom.tbz2$DEVDIR/64_TX1/Linux_for_Tegra_64_tx1/kernel/kernel_headers.tbz2

     

    运行应用程序脚本以生成要闪存的映像

    cd $DEVDIR/64_TX1/Linux_for_Tegra_64_tx1/

    sudo ./apply_binaries.sh

     

    输出:

    Using rootfs directory of:/home/dsoto/devdirs/tegra/Jetpack/TX1/Linux_for_Tegra_tx1/rootfs

    Extracting the NVIDIA user space componentsto /home/dsoto/devdirs/tegra/Jetpack/TX1/Linux_for_Tegra_tx1/rootfs

    Extracting the BSP test tools to/home/dsoto/devdirs/tegra/Jetpack/TX1/Linux_for_Tegra_tx1/rootfs

    Extracting the NVIDIA gst test applicationsto /home/dsoto/devdirs/tegra/Jetpack/TX1/Linux_for_Tegra_tx1/rootfs

    Extracting the configuration files for thesupplied root filesystem to/home/dsoto/devdirs/tegra/Jetpack/TX1/Linux_for_Tegra_tx1/rootfs

    Creating a symbolic link nvgstplayerpointing to nvgstplayer-0.10

    Creating a symbolic link nvgstcapturepointing to nvgstcapture-0.10

    Adding symlink libcuda.so -->libcuda.so.1.1 in target rootfs

    Adding symlink libGL.so --> libGL.so.1in target rootfs

    Adding symlink libcuda.so -->tegra/libcuda.so in target rootfs

    Adding symlink libEGL.so --> libEGL.so.1in target rootfs

    Extracting the firmwares and kernel modulesto /home/dsoto/devdirs/tegra/Jetpack/TX1/Linux_for_Tegra_tx1/rootfs

    Extracting the kernel headers to /usr/srcin target rootfs

    Installing zImage into /boot in targetrootfs

    Installing Image into /boot in targetrootfs

    Installing the board *.dtb files into /bootin target rootfs

    Success!

     

    6) 从新刷机,修改TX1的kernel

    您可以使用Jetpack直接刷新您的图像,而不是直接使用脚本,但这需要时间(约10分钟),因为我们将需要jetpack再次生成system.img

    备份你的system.img

    cd$DEVDIR/64_TX1/Linux_for_Tegra_tx1/bootloader/

    mv system.img.raw system.img$DEVDIR/images/packages-backup/

     

    只需运行Jetpack作为您首次安装它:

    cd $DEVDIR

    ./JetPack-L4T-2.1-linux-x64.run

    具体操作可详见刷机教程

     

    PS:kernel是否更改可查看串口打印信息,Jetson TX1串口调试

        Linuxversion 3.10.96-tegra (buildbrain@mobile-u64-1072) (gcc version 4.8.2 (GCC) )#1 SMP PREEMPT Wed Nov 9 19:42:57 PST 2016日期是否被修改


    参考:

    http://blog.csdn.net/mantis_1984/article/details/61616541

    https://developer.ridgerun.com/wiki/index.php?title=Compiling_Tegra_X1_source_code

    展开全文
  • Linux内核kernel panic机制浅析

    千次阅读 2015-05-06 16:55:03
     内核错误(Kernel panic)是指操作系统在监测到内部的致命错误,并无法安全处理此错误时采取的动作。一旦到这个情况,kernel就尽可能把它此时能获取的全部信息都打印出来,至于能打印出多少信息,那就看是哪种情况...

    1.简介:

        内核错误(Kernel panic)是指操作系统在监测到内部的致命错误,并无法安全处理此错误时采取的动作。一旦到这个情况,kernel就尽可能把它此时能获取的全部信息都打印出来,至于能打印出多少信息,那就看是哪种情况导致它panic了。这个概念主要被限定在Unix以及类Unix系统中;对于Microsoft Windows系统,等同的概念通常被称为蓝屏死机。


    操作系统内核中处理Kernel panic的子程序(在AT&T派生类以及BSDUnix中,通常称为panic())通常被设计用来向控制台输出错误信息,向磁盘保存一份内核内存的转储,以便事后的调试,然后等待系统被手动重新引导,或自动重新引导。该程序提供的技术性信息通常是用来帮助系统管理员或者软件开发者诊断问题的。

    操作系统试图读写无效或不允许的内存地址是导致内核错误的一个常见原因。内核错误也有可能在遇到硬件错误或操作系统BUG时发生。在许多情况中,操作系统可以在内存访问违例发生时继续运行。然而,系统处于不稳定状态时,操作系统通常会停止工作以避免造成破坏安全和数据损坏的风险,并提供错误的诊断信息。内核错误在早期的Unix系统中被引入,显示了在UnixMultics在设计哲学上的主要差异之一。Multics的开发者Tom van Vleck曾引述了一段在这个问题上与Unix开发者Dennis Ritchie的讨论:

    我提醒Dennis说,我在Multics中写的近半数代码都是错误恢复代码。 他说:“我们不需要这些。我们有称为panic的子程序,如果发生了错误就可以调用这个函数,使得系统崩溃, 然后你可以在大厅里面大叫:‘嘿,重启机器’。”

    原始的panic()函数从UNIX第五版开始到基于VAXUNIX 32V期间几乎没有变化,只是输出一条错误信息,然后就使系统进入NOP的死循环中。当改进UNIX的基础代码的时候,panic()函数也有所改进,可以向控制台输出多种格式的调试信息。

    kernel panic 主要有以下几个出错提示:

    Kernel panic - not syncing fatal exception in interrupt

    kernel panic - not syncing: Attempted to kill the idle task!

    kernel panic - not syncing: killing interrupt handler!

    Kernel Panic - not syncingAttempted to kill init!


    2.什么能导致kernel panic

    一般出现下面的情况,就认为是发生了kernel panic:
    • 机器彻底被锁定不能使用

    • 数字键(Num Lock)大写锁定键(Caps Lock)滚动锁定键(Scroll Lock)不停闪烁

    • 如果在终端下应该可以看到内核dump出来的信息包括一段Aieee”信息或者Oops”信息

    • Windows蓝屏相似


    有两种主要类型kernel panic

    hard panic(也就是Aieee信息输出)

    soft panic (也就是Oops信息输出)

    只有加载到内核空间的驱动模块才能直接导致kernel panic,你可以在系统正常的情况下,使用lsmod查看当前系统加载了哪些模块。 除此之外,内建在内核里的组件(比如memory map等)也能导致panic。因为hard panicsoft panic本质上不同,因此我们分别讨论。

    2.1 hard panic

    原因

          对于hard panic而言,最大的可能性是驱动模块的中断处理(interrupt handler)导致的,一般是因为驱动模块在中断处理程序中访问一个空指针(null pointre)。一旦发生这种情况,驱动模块就无法处理新的中断请求,最终导致系统崩溃。

          例如:在多核系统中,包括AP应用处理器、mcu微控制器和modem处理器等系统中,mcu控制器用于系统的低功耗控制,mcu微控制器由于某种原因超时向AP应用处理器发送一个超时中断,AP接受中断后调用中断处理函数读取mcu的状态寄存器,发现是mcu的超时中断,就在中断处理程序中主动引用一个空指针,迫使AP处理器打印堆栈信息然后重启linux系统。这就是一个典型的hard panic

    信息收集

          根据panic的状态不同,内核将记录所有在系统锁定之前的信息。因为kenrel panic是一种很严重的错误,不能确定系统能记录多少信息,下面是一些需要收集的关键信息,他们非常重要,因此尽可能收集全,当然如果系统启动的时候就kernel panic,那就无法知道能收集到多少有用的信息了。

    1. /var/log/messages幸运的时候,整个kernel panic栈跟踪信息都能记录在这里。

    2. 应用程序/库日志可能可以从这些日志信息里能看到发生panic之前发生了什么。

    3. 其他发生panic之前的信息,或者知道如何重现panic那一刻的状态

    4. 终端屏幕dump信息,一般OS被锁定后,复制,粘贴肯定是没戏了,因此这类信息,你可以需要借助数码相机或者原始的纸笔工具了。

    实际上,当内核发生panic时,linux系统会默认立即重启系统,当然这只是默认情况,除非你修改了产生panic时重启定时时间,这个值默认情况下是0,即立刻重启系统。所以当panic时没有把kernel信息导入文件的话,那么可能你很难再找到panic产生的地方。

    Linux的稳定性勿容置疑,但是有些时候一些Kernel的致命错误还是会发生(有些时候甚至是因为硬件的原因或驱动故障),Kernel Panic会导致系统crash,并且默认的系统会一直hung在那里,直到你去把它重新启动! 不过你可以在/etc/sysctl.conf文件中加入

    2.2 soft panic(oops)

    Linux上,oopsLinux内核的行为不正确,并产生了一份相关的错误日志。许多类型的oops会导致kernel panic,即令系统立即停止工作,但部分oops也允许继续操作,作为与稳定性的妥协。这个概念只代表一个简单的错误。

    当内核检测到问题时,它会打印一个oops信息然后终止全部相关进程。oops信息可以帮助Linux内核工程师调试,检测oops出现的条件,并修复导致oops的程序错误。

    Linux官方内核文档中提到的oops信息被放在内核源代码Documentation/oops-tracing.txt中。通常klogd是用来将oops信息从内核缓存中提取出来的,然而,在某些系统上,例如最近的Debian发行版中,rsyslogd代替了klogd,因此,缺少klogd进程并不能说明log文件中缺少oops信息的原因。

    若系统遇到了oops,一些内部资源可能不再可用。即使系统看起来工作正常,非预期的副作用可能导致活动进程被终止。oops常常导致kernel panic,若系统试图使用被禁用的资源。Kernelloops提到了一种用于收集和提交oops到 http://www.kerneloops.org/ 的软件 。Kerneloops.org同时也提供oops的统计信息。


    症状:

    1.没有hard panic严重

    2.通常导致段错误(segmentation fault)

    3.可以看到一个oops信息,/var/log/messages里可以搜索到’Oops’

    4.机器稍微还能用(但是收集信息后,应该重启系统)


    原因:

          凡是非中断处理引发的模块崩溃都将导致soft panic在这种情况下,驱动本身会崩溃,但是还不至于让系统出现致命性失败,因为它没有锁定中断处理例程。导致hard panic的原因同样对soft panic也有用(比如在运行时访问一个空指针)


    信息收集:

           soft panic发生时,内核将产生一个包含内核符号(kernel symbols)信息的dump数据,这个将记录在/var/log/messages里。为了开始排查故障,可以使用ksymoops工具来把内核符号信息转成有意义的数据。

    为了生成ksymoops文件,需要:

    /var/log/messages里找到的堆栈跟踪文本信息保存为一个新文件。确保删除了时间戳(timestamp),否则ksymoops会失败。

    运行ksymoops程序(如果没有,请安装)

    详细的ksymoops执行用法,可以参考ksymoops(8)手册。

    3.Kernel panic实例:

          今天就遇到 一个客户机器内核报错:“Kernel panic-not syncing fatal exception”,重启后正常,几个小时后出现同样报错,系统down了,有时重启后可恢复有时重启后仍然报同样的错误。

          什么是fatal exception?

         “致命异常(fatal exception)表示一种例外情况,这种情况要求导致其发生的程序关闭。通常,异常(exception)可能是任何意想不到的情况(它不仅仅包括程序错误)。致命异常简单地说就是异常不能被妥善处理以至于程序不能继续运行。

         软件应用程序通过几个不同的代码层与操作系统及其他应用程序相联系。当异常(exception)在某个代码层发生时,为了查找所有异常处理的代码,各个代码层都会将这个异常发送给下一层,这样就能够处理这种异常。如果在所有层都没有这种异常处理的代码,致命异常(fatal exception)错误信息就会由操作系统显示出来。这个信息可能还包含一些关于该致命异常错误发生位置的秘密信息(比如在程序存储范围中的十六进制的位置)。这些额外的信息对用户而言没有什么价值,但是可以帮助技术支持人员或开发人员调试程序。

         当致命异常(fatal exception)发生时,操作系统没有其他的求助方式只能关闭应用程序,并且在有些情况下是关闭操作系统本身。当使用一种特殊的应用程序时,如果反复出现致命异常错误的话,应将这个问题报告给软件供应商。 ” 而且此时键盘无任何反应,必然使用reset键硬重启。

    处理panic后的系统自动重启panic.c源文件有个方法,当panic挂起后,指定超时时间,可以重新启动机器,这就是前面说的panic超时重启。

    # vi linux-2.6.31.8/kernel/panic.c ...

    if (panic_timeout > 0) {

    /*

    * Delay timeout seconds before rebooting the machine.

    * We can't use the "normal" timers since we just panicked.

    */

    int i;

    printk(KERN_EMERG "Rebooting in %d seconds..", panic_timeout);

    for (i = 0; i < panic_timeout*1000; ) {

    touch_nmi_watchdog();

    i += panic_blink(i);

    mdelay(1);

    i++;

    }

    /*

    * This will not be a clean reboot, with everything

    * shutting down. But if there is a chance of

    * rebooting the system it will be rebooted.

    */

    emergency_restart();

    } ...

    修改方法:

    /etc/sysctl.conf文件中加入

    kernel.panic = 30 #panic错误中自动重启,等待时间为30

    kernel.sysrq=1 #激活Magic SysRq! 否则,键盘鼠标没有响应

    设置kernel.sysrq=1使得鼠标键盘有反应了之后按住 [ALT]+[SysRq]+[COMMAND], 这里SysRqPrint SCR键,而COMMAND按以下来解释:

    b – 立即重启
    e – 
    发送SIGTERMinit之外的系统进程
    o – 
    关机
    s – sync
    同步所有的文件系统
    u – 
    试图重新挂载文件系统

     很多网友安装linux出现“Kernel panic-not syncing fatal exception in interrupt”是由于网卡驱动原因。解决方法:将选项“Onboard Lan”的选项“Disabled”,重启从光驱启动即可。等安装完系统之后,再进入BIOS将“Onboard Lan”的选项给“enable”,下载相应的网卡驱动安装。

        如出现以下报错:

    init() r8168 … 

              … …

             … Kernel panic: Fatal exception

    r8168是网卡型号。

    BIOS中禁用网卡,从光驱启动安装系统。再从网上下载网卡驱动安装。

    #tar  vjxf  r8168-8.014.00.tar.bz2

    # make  clean  modules       (as root or with sudo)

          # make  install

          # depmod  -a

          # modprobe  r8168

    安装好系统后reboot进入BIOS把网卡打开。


    另有网友在Kernel panic出错信息中看到“alc880”,这是个声卡类型。尝试着将声卡关闭,重启系统,搞定。

      安装linux系统遇到安装完成之后,无法启动系统出现Kernel panic-not syncing fatal exception。很多情况是由于板载声卡、网卡、或是cpu 超线程功能(Hyper-Threading )引起的。这类问题的解决办法就是先查看错误代码中的信息,找到错误所指向的硬件,将其禁用。系统启动后,安装好相应的驱动,再启用该硬件即可。

    另外出现Kernel Panic — not syncing: attempted to kill init”和“Kernel Panic — not syncing: attempted to kill idle task”有时把内存互相换下位置或重新插拔下可以解决问题。

    还有一种情况,swap交换分区没有配置的时候,也会出现”kernel panic – not syncing : attempted to kill init”,已在RHEL6.2_64bit上测试。

    参考http://blog.csdn.net/ylyuanlu/article/details/9115159

    http://wiki.linuxdeepin.com/index.php?title=Linux_kernel_panic&oldid=7764

    http://www.vpsee.com/2010/08/reboot-linux-after-a-kernel-panic/

    http://www.4byte.cn/question/721620/how-to-detect-a-kernel-panic-on-a-remote-machine.html

    展开全文
  • OpenCV滤波器内核Kernel

    千次阅读 2018-06-24 20:57:48
    在图像处理中许多滤波器(滤波函数)都会使用核(Kernel),那么什么是核呢? 核其实是一组权重,决定了如何利用某一个点周围的像素点来计算新的像素点,核也被称为卷积矩阵,对一个区域的像素做调和或者卷积运算,...

        在图像处理中许多滤波器(滤波函数)都会使用核(Kernel),那么什么是呢?

        核其实是一组权重,决定了如何利用某一个点周围的像素点来计算新的像素点,核也被称为卷积矩阵,对一个区域的像素做调和或者卷积运算,通常基于核的滤波器被称为卷积滤波器。OpenCV中的filter2D()函数,可以运用由用户指定的任意核来计算。

        核是什么样的格式?

        通常核是一个二位数组,特征是奇数行、奇数列,中心位置对应着感兴趣的像素,数组每一个元素为整数或者浮点数,相对应值的大小对应其权重,比如:

                                        kernel1=numpy.array([[-1, -1,-1],

                                                                             [-1, 9, -1],

                                                                             [-1,-1,-1]])

        表明感兴趣的像素值权重为9,相邻区域权重为-1,而计算则为将中心像素值乘以9,减去周围所有的像素,如果感兴趣的像素与周围像素存在差异,则该差异会被放大,达到了锐化的目的。【注意】权重加起来和为1,这样做的结果是不会改变图像的亮度,如果权重之和为0,则会得到一个边缘检测核,将边缘转为白色,而非边缘区域转为黑色。

        使用方法:cv2.filter2D(InputArray=img, depth=-1,kernel, OutputArray=dst)

        depth指定图像每个通道的位深度(位深度cv2.CV_8U表示每个通道为8位),关于这部分详解内容见参看链接[1],为负值表示目标图像和源图像保持一致。而针对彩色图像,filter2D会对每一个通道都使用相同的核,如果要用不同的核,需要使用split()和merge()函数。

    python实现各种滤波及其表现:

    卷积类:

    class ConvolutionFilter(object):
        """
        一个普通的卷积滤波器(灰度图或者彩图)
        """
        
        def __init__(self,kernel):
            self._kernel=kernel
            
        def apply(self,src):
            dst=cv2.filter2D(src,-1,self._kernel)
            return dst


    锐化滤波器类(sharpenFilter):

    class SharpenFilter(ConvolutionFilter):
        """
        一个指定核的滤波器
        """
        
        def __init__(self):
            kernel=numpy.array([[-1,-1,-1],
                               [-1,9,-1],
                               [-1,-1,-1]])
            ConvolutionFilter.__init__(self,kernel)

    实现不同的滤波器只需要修改相应的核即可,比较有意思的一个核,它不对称,同时具有模糊(因为有正的权重)和锐化(因为负的权重)的作用,会产生浮雕(emboss)的效果

     kernel=numpy.array([[-2, -1, 0],
                         [-1, 1, 1],
                         [0, 1, 2]])
    调用起来也很方便:
    import cv2
    import filters
    image=cv2.imread('building.jpg')cv2.imshow('src',image)
    #Emboss滤波效果
    embossFilter=filters.EmbossFilter()
    embossImg=embossFilter.apply(src=image)
    cv2.imshow('embossImage',embossImg)
    cv2.waitKey(0)cv2.destroyAllWindows()

    下面看看实际处理效果:

    图从左至右由上至下分别为:1)原图 2)锐化 3)自编核 4)模糊处理 5)浮雕 6)Canny边缘检测

        单单是改变核,哪怕是某一个元素的值,实现的功能可能就会不同,而要注意的是在边缘检测前往往会对图像进行模糊处理,可以很好的解决将噪声错误的识别为边缘的问题,opencv内常用的模糊方法有blur()(简单的算术平均),medianBlur(src,blurKsize)以及GaussianBlur(src,ksize)。

        目的相同,不同的核其效果也会有所差别,方法的选择取决于你的目的。


    参考文献

    OpenCV 3计算机视觉 Python语言实现(第2版)

    opencv2函数学习之blur,GaussianBlur,medianBlur和bilateralFilter:实现图像平滑处理


    展开全文
  • CentOS6.X 升级内核Kernel

    万次阅读 2017-12-01 10:19:19
    CentOS 6.X升级Kernel,方便安装Docker升级方法 参考:http://elrepo.org/tiki/tiki-index.php导入public key: rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org 有关ELRepo项目使用的GPG密钥的详细...

    CentOS 6.X升级Kernel,方便安装Docker

    • 升级方法

    参考:http://elrepo.org/tiki/tiki-index.php

    • 导入public key:
    rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org

    有关ELRepo项目使用的GPG密钥的详细信息,请参阅https://www.elrepo.org/tiki/key 如果您的系统启用了安全启动,请参阅SecureBootKey页面以获取更多信息。

    • 为RHEL-7,SL-7或CentOS-7安装ELRepo:
    rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm (external link)
    • 为RHEL-6,SL-6或CentOS-6安装ELRepo:
    rpm -Uvh http://www.elrepo.org/elrepo-release-6-8.el6.elrepo.noarch.rpm
    • 升级Kernel

    这里需要注意的是,在 ELRepo 中有两个内核选项,一个是 kernel-lt(长期支持版本),一个是 kernel-ml(主线最新版本),采用长期支持版本(kernel-lt),更稳定一些

    # kernel-lt
    yum --enablerepo=elrepo-kernel install kernel-lt -y 
    or
    # kernel-ml
    yum --enablerepo=elrepo-kernel install kernel-ml -y 
    • 安装完成,需要修改grub
    vim /etc/grub.conf

    根据安装好以后的内核位置,修改 default 的值,一般是修改为0,因为 default 从 0 开始,一般新安装的内核在第一个位置,所以设置default=0

    这里写图片描述

    所有操作都执行完毕以后,重启主机,重启后执行 uname -r,查看内核版本号

    [root@db-slave ~]# uname -r           
    4.14.3-1.el6.elrepo.x86_64
    展开全文
  • CentOS yum方式升级内核kernel

    千次阅读 2019-04-07 20:09:02
    CentOS7的32位,我试过用CentOS6的32位内核来升级,可升级可重启可使用,半个小时后删除了此系统没再尝试使用,所以不知道会带来什么不良体验。) CentOS、Debian升级内核的方式,前几篇日志中也提到过。 自编译...
  • nVIDIA Jetson TX1 内核kernel编译

    千次阅读 2017-03-12 13:45:03
    一、准备工作1、在官网下载最新的kernel源代码:https://developer.nvidia.com/embedded/downloads#?tx=$software,l4t-tx12、ubuntu16.04编译环境准备: 下载两个交叉编译器aarch64-linux-gnu和aarch64-linux-gnu,...
  • Android 编译内核kernel源码

    千次阅读 2014-04-17 16:32:42
    编译kernel源码,首先需要有相应的代码,可以到
  • centos6内核kernel删除救援模式

    千次阅读 2017-08-04 22:00:15
    linux 救援模式作用: ...删除kernel 重启[root@centos6 ~]#rpm -qa kernel kernel-2.6.32-696.el6.x86_64 [root@centos6 ~]#rpm -e kernel --nodeps在重启出现开机界面时按下esc进入boot menu。 再选
  • 一 why 记录下移植内核过程中,出现的错误以及解决问题办法 a. 加载内核时,提示提示空分区名(empty pattition name) 原因,分区被异常擦掉了,解决办法 ... 重新烧写uboot、kernel、以及文件系统 ...
  • 【CUDA】CUDA编程:内核kernel

    千次阅读 2018-08-24 14:13:50
    内核使用__global__声明符定义,使用&lt;&lt;&lt;...&gt;&gt;&gt;执行配置语法指定执行某一指定内核的线程数。每一个执行内核的线程拥有一个独一无二的线程ID,通过内置的变量threadIdx访问...
  • 修改linux内核kernel的开机图片(原为小企鹅图片)。 我学习成长的一个学习笔记,谢谢! 本文主要是介绍三部分内容: 1》如何制作linux内核所需要的开机图片(ppm格式); 2》修改开机图片的两种方法; 3》调试过程...
  • 转自:... 在编译内核模块时, 如有Makefile文件如下: ifneq ($(KERNELRELEASE),) param-objs := file1.o file2.o obj-m := para
  • 编译内核kernel(2.6.29)(草)

    千次阅读 2012-06-28 13:18:10
    编译内核kernel(2.6.29) 1、解压gec6410-kernel-2.6.29-v1.1.tar.gz  解压命令:tar -zxvf gec6410-kernel-2.6.29-v1.1.tar.gz 2、kernel默认配置文件名.config  cp GEC_LCD43_CFG .config //将GEC_...
  • 上一篇讲了在jetson平台上编译内核,本篇讲在x86 PC上编译 这里提一点,我并不建议你用虚拟机来搞Linux开发,你的host至少应该是个ubuntu+windows双系统,...玩转NVIDIA Jetson AGX Xavier(10)— L4T内核kernel编...
  • Ubuntu 内核——Kernel 操作

    千次阅读 2019-01-08 15:00:38
    目前可获取的内核版本 apt-cache search linux|grep linux-image 已经安装好的内核 sudo dpkg --get-selections |grep linux-image 查看当前系统的内核 uname -r 查看当前系统内核 dpkg --get-selections| ...
  • 小强学Python+OpenCV之-1.5内核Kernel

    千次阅读 2017-06-06 21:38:22
    中间的Convolution kernel就是核,或者说是一个卷积核。核与在源图像上的投影区域进行卷积,得到新的像素。当核遍历了整个源图像之后,就得到了一张新的图像(当然,要注意,这里的新的图像小了一号,因为,卷积核的...
  • 内核kernel以及根文件系统rootfs是如何映射到对应的nand flash的地址的 【解答】内核kernel以及根文件系统rootfs是如何映射到对应的nand flash的地址的 【某人问题 内核在启动的过程中,是如何完成将本地的flash...
  • kernel的问题可以说很多,本节简单介绍一下这里边的关系,为什么要编译内核以及编译方法有哪些。 L4T是什么 L4T是Linux for Tegra的缩写,因为jetson系列用的是Tegra架构,因此L4T可以理解为jetson定制的Linux操作...
  • 在Jetson平台上直接编译内核的好处是不存在交叉编译,编译非常顺利。但是慢! 适用于想在Jetson平台上一步到位,干所有事的玩家 本期内核版本L4T 32.1,使用Jetpack4.2刷机 官网教程有点confuse,因为没说明白是在...
  • Android内核基于Linux kernel,需要知道Android系统的Linux kernel版本号,才能对其内核进行编译移植
  • uboot启动正常,加载内核kernel启…

    千次阅读 2013-12-02 09:12:55
    先说现象吧:uboot能够正常启动,不过在kernel启动时却出现起不了的现象,停在这里 Uncompressing Linux.............................................................. done, booting the kernel。就是在这里停住...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 310,102
精华内容 124,040
关键字:

内核kernel是什么意思