分类 技术 下的文章

一个关于让 Linux Mint 20.2 与逻辑卷管理器(LVM)一起工作的教程。

 title=

几周前,Linux Mint 的人员发布了他们的开源操作系统的 20.2 版本。Live ISO 中内置的安装程序非常好,只需要点击几下就可以安装操作系统。如果你想定制你的分区,你甚至有一个内置的分区软件。

安装程序重点关注在简单的安装上:定义你的分区并安装到这些分区。对于那些想要更灵活的设置的人来说, 逻辑卷管理器 logical volume manager (LVM)是个不错的选择,你可以通过设置卷组(VG)并在其中定义你的逻辑卷(LV)。

LVM 是一个硬盘管理系统,允许你在多个物理驱动器上创建存储空间。换句话说,你可以把几个小驱动器“拴”在一起,这样你的操作系统就会把它们当作一个驱动器。除此之外,它还有实时调整大小、文件系统快照和更多的优点。这篇文章并不是关于 LVM 的教程(网上已经有很多 这方面不错的信息了)。相反,我的目标是贴合这篇文章的主题,只关注让 Linux Mint 20.2 与 LVM 一起工作。

作为一个桌面操作系统,其安装程序致力于简单化,在 LVM 上安装 Linux Mint 20.2 会略微复杂一些,但不会太复杂。如果你在安装程序中选择了 LVM,你会得到一个由 Linux Mint 开发者定义的设置,而且你在安装时无法控制各个卷。

然而,有一个解决方案:在临场 ISO 中,该方案只需要在终端中使用几个命令来设置 LVM,然后你可以继续使用常规安装程序来完成工作。

我安装了 Linux Mint 20.2 和 XFCE 桌面,但其他 Linux Mint 桌面的过程也类似。

分区驱动器

在 Linux Mint 临场 ISO 中,你可以通过终端和 GUI 工具访问 Linux 命令行工具。如果你需要做任何分区工作,你可以使用命令行 fdiskparted 命令,或者 GUI 应用 gparted。我想让这些操作简单到任何人都能遵循,所以我会在可能的情况下使用 GUI 工具,在必要时使用命令行工具。

首先,为安装创建几个分区。

使用 gparted(从菜单中启动),完成以下工作:

首先,创建一个 512MB 的分区,类型为 FAT32(这是用来确保系统可启动)。512MB 对大多数人来说是富余的,你可以用 256MB 甚至更少,但在今天的大容量磁盘中,即使分配 512MB 也不是什么大问题。

 title=

接下来,在磁盘的其余部分创建一个 lvm2 pv 类型(LVM 2 物理卷)的分区(这是你的 LVM 的位置)。

 title=

现在打开一个终端窗口,并将你的权限提升到 root:

$ sudo -s
# whoami
root

接下来,你必须找到你之前创建的 LVM 成员(那个大分区)。使用下列命令之一:lsblk -fpvspvscan

# pvs
PV      VG Fmt  [...]
/dev/sda2    lvm2 [...]

在我的例子中,该分区位于 /dev/sda2,但你应该用你的输出中得到的内容来替换它。

现在你知道了你的分区有哪些设备,你可以在那里创建一个 LVM 卷组(VG):

# vgcreate vg /dev/sda2

你可以使用 vgsvgscan 看到你创建的卷组的细节。

创建你想在安装时使用的逻辑卷(LV)。为了简单,我分别创建了 root 根分区(/)和 swap 交换分区,但是你可以根据需要创建更多的分区(例如,为 /home 创建一个单独的分区)。

# lvcreate -L 80G -n root vg
# lvcreate -L 16G -n swap vg

我的例子中的分区大小是任意的,是基于我可用的空间。使用对你的硬盘有意义的分区大小。

你可以用 lvslvdisplay 查看逻辑卷。

终端操作到这就结束了。

安装 Linux

现在从桌面上的图标启动安装程序:

  • 进入 “Installation type”,选择 “Something else”。
  • 编辑 512Mb 的分区并将其改为 EFI
  • 编辑根逻辑卷,将其改为 ext4(或一个你选择的文件系统)。选择将其挂载为根目录(/),并选择将其格式化。
  • 编辑 swap 分区并将其设置为交换分区。
  • 继续正常的安装过程。Linux Mint 安装程序会将文件放在正确的位置并为你创建挂载点。

完成了。在你的 Linux Mint 安装中享受 LVM 的强大。

如果你需要调整分区大小或在系统上做任何高级工作,你会感谢选择 LVM。


via: https://opensource.com/article/21/8/install-linux-mint-lvm

作者:Kenneth Aaron 选题:lujun9972 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

安装完服务器之后,下一步就是安装和配置 0penVPN。

 title=

0penVPN 在两点之间创建一个加密通道,阻止第三方访问你的网络流量数据。通过设置你的 “虚拟专用网络” 服务,你可以成为你自己的 “虚拟专用网络” 服务商。许多流行的 “虚拟专用网络” 服务都使用 0penVPN,所以当你可以掌控自己的网络时,为什么还要将你的网络连接绑定到特定的提供商呢?

本系列的 第一篇文章 展示了如何安装和配置一台作为你的 0penVPN 服务器的 Linux 计算机。同时也讲述了如何配置你的路由器以便你可以在外部网络连接到你的服务器。

第二篇文章将演示根据 0penVPN wiki 给定的步骤安装一个 0penVPN 服务软件。

安装 0penVPN

首先,使用包管理器安装 0penVPN 和 easy-rsa 应用程序(帮助你在服务器上设置身份验证)。本例使用的是 Fedora Linux,如果你选择了不同的发行版,请选用合适的命令。

$ sudo dnf install openvpn easy-rsa

此操作会创建一些空目录:

  • /etc/openvpn
  • /etc/openvpn/client
  • /etc/openvpn/server

如果这些目录在安装的过程中没有创建,请手动创建它们。

设置身份验证

0penVPN 依赖于 easy-rsa 脚本,并且应该有自己的副本。复制 easy-rsa 脚本和文件:

$ sudo mkdir /etc/openvpn/easy-rsa
$ sudo cp -rai /usr/share/easy-rsa/3/* /etc/openvpn/easy-rsa/

身份验证很重要,0penVPN 非常重视它。身份验证的理论是,如果 Alice 需要访问 Bob 公司内部的私人信息,那么 Bob 确保 Alice 真的是 Alice 就至关重要。同样的,Alice 也必须确保 Bob 是真正的 Bob。我们称之为相互认证。

现有的最佳实践是从三个可能因素中的选择两个检查属性:

  • 你拥有的
  • 你知道的
  • 你是谁

选择有很多。0penVPN 安装使用如下:

  • 证书:客户端和服务端都拥有的东西
  • 证书口令:某人知道的东西

Alice 和 Bob 需要帮助彼此来验证身份。由于他们都相信 Cathy,Cathy 承担了称为 证书颁发机构 certificate authority (CA)的角色。Cathy 证明 Alice 和 Bob 都是他们自己。因为 Alice 和 Bob 都信任 Cathy,现在他们也相互信任了。

但是是什么让 Cathy 相信 Alice 和 Bob 是真的 Alice 和 Bob?Cathy 在社区的声誉取决于如何正确处理这件事,因此如果她希望 Denielle、Evan、Fiona、Greg 和其他人也信任她,她就需要严格测试 Alice 和 Bob 的宣称内容。当 Alice 和 Bob 向 Cathy 证明了他们是真的 Alice 和 Bob 之后,Cathy 将向 Alice 和 Bob 签署证书,让他们彼此和全世界分享。

Alice 和 Bob 如何知道是 Cathy 签署了证书,而不是某个人冒充她签发了证书?他们使用一项叫做公钥加密的技术:

  • 找到一种用一个密钥加密并用另一个密钥解密的加密算法。
  • 将其中一个设为私钥,将另外一个设为公钥。
  • Cathy 与全世界分享她的公钥和她的签名的明文副本。
  • Cathy 用她的私钥加密她的签名,任何人都可以用她分享的公钥解密。
  • 如果 Cathy 的签名解密后与明文副本匹配,Alice 和 Bob 就可以相信 Cathy 确实签署了它。

每次在线购买商品和服务时,使用的就是这种技术。

认证实现

0penVPN 的 文档 建议在单独的系统上或者至少在 0penVPN 服务器的单独目录上设置 CA。该文档还建议分别从服务端和客户端生成各自的证书。因为这是一个简单的演示设置,你可以使用 0penVPN 服务器设置 CA,并将证书和密钥放入服务器上的指定目录中。

从服务端生成证书,并将证书拷贝到各个客户端,避免客户端再次设置。

此实现使用自签名证书。这是因为服务器信任自己,而客户端信任服务器。因此,服务器是签署证书的最佳 CA。

在 0penVPN 服务器上设置 CA:

$ sudo mkdir /etc/openvpn/ca
$ cd /etc/openvpn/ca
$ sudo /etc/openvpn/easy-rsa/easyrsa init-pki
$ sudo /etc/openvpn/easy-rsa/easyrsa build-ca

使用一个易记难猜的密码。

设置服务器密钥对和认证请求:

$ cd /etc/openvpn/server
$ sudo /etc/openvpn/easy-rsa/easyrsa init-pki
$ sudo /etc/openvpn/easy-rsa/easyrsa gen-req OVPNserver2020 nopass

在此例中,OVPNServer2020 是你在本系列第一篇文章中为 0penVPN 服务器设置的主机名。

生成和签署证书

现在你必须向 CA 发送服务器请求并生成和签署服务器证书。

此步骤实质上是将请求文件从 /etc/openvpn/server/pki/reqs/OVPNserver2020.req 复制到 /etc/openvpn/ca/pki/reqs/OVPNserver2020.req 以准备审查和签名:

$ cd /etc/openvpn/ca
$ sudo /etc/openvpn/easy-rsa/easyrsa \
  import-req /etc/openvpn/server/pki/reqs/OVPNserver2020.req OVPNserver2020

审查并签署请求

你已经生成了一个请求,所以现在你必须审查并签署证书:

$ cd /etc/openvpn/ca
$ sudo /etc/openvpn/easy-rsa/easyrsa \
  show-req OVPNserver2020

以服务器身份签署请求:

$ cd /etc/openvpn/ca
$ sudo /etc/openvpn/easy-rsa/easyrsa \
  sign-req server OVPNserver2020

将服务器和 CA 证书的副本放在它们所属的位置,以便配置文件获取它们:

$ sudo cp /etc/openvpn/ca/pki/issued/OVPNserver2020.crt \
  /etc/openvpn/server/pki/
$ sudo cp /etc/openvpn/ca/pki/ca.crt \
  /etc/openvpn/server/pki/

接下来,生成 Diffie-Hellman 参数,以便客户端和服务器可以交换会话密钥:

$ cd /etc/openvpn/server
$ sudo /etc/openvpn/easy-rsa/easyrsa gen-dh

快完成了

本系列的下一篇文章将演示如何配置和启动你刚刚构建的 0penVPN 服务器。

本文的部分内容改编自 D. Greg Scott 的博客,并经许可重新发布。


via: https://opensource.com/article/21/7/openvpn-router

作者:D. Greg Scott 选题:lujun9972 译者:perfiffer 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

这个 shell 脚本 styli.sh 可以帮助你每小时自动改变你的 Linux 桌面壁纸,并且有几个选项。

用一张漂亮的壁纸来开始你的一天,你的桌面让人耳目一新。但寻找壁纸,然后保存,最终设置为壁纸,是非常麻烦的。所有这些步骤都可以通过这个叫做 styli.sh 的脚本完成。

styli.sh - 每小时改变你的 Linux 桌面壁纸

这是一个 shell 脚本,你可以从 GitHub 上下载。当运行时,它从 Reddit 的热门版块中获取壁纸并将其设置为你的壁纸。

该脚本适用于所有流行的桌面环境,如 GNOME、KDE Plasma、Xfce 和 Sway 窗口管理器。

它有很多功能,你可以通过 crontab 来运行这个脚本,并在特定的时间间隔内得到一张新的壁纸。

下载并安装、运行

打开一个终端,并克隆 GitHub 仓库。如果没有安装的话,你需要安装 feh 和 git。

git clone https://github.com/thevinter/styli.sh
cd styli.sh

要设置随机壁纸,根据你的桌面环境运行以下内容。

Change your Linux Desktop Wallpaper Every Hour using styli.sh

GNOME:

./styli.sh -g

Xfce:

./styli.sh -x

KDE Plasma:

./styli.sh -k

Sway:

./styli.sh -y

每小时改变一次

要每小时改变背景,请运行以下命令:

crontab -e

并在打开的文件中加入以下内容。不要忘记改变脚本路径。

@hourly script/path/styli.sh

改变版块

在源目录中,有一个名为 subreddits 的文件。它填满了一些标准的版块。如果你想要更多一些,只需在文件末尾添加版块名称。

更多配置选项

壁纸的类型、大小,也可以设置。以下是这个脚本的一些独特的配置选项。

设置一个随机的 1920×1080 背景:

./styli.sh

指定一个所需的宽度或高度:

./styli.sh -w 1080 -h 720
./styli.sh -w 2560
./styli.sh -h 1440

根据搜索词设置壁纸:

./styli.sh -s island
./styli.sh -s “sea sunset”
./styli.sh -s sea -w 1080

从设定的一个版块中获得一个随机壁纸:

注意:宽度/高度/搜索参数对 reddit 不起作用。

./styli.sh -l reddit

从一个自定义的版块获得随机壁纸:

./styli.sh -r
./styli.sh -r wallpaperdump

使用内置的 feh -bg 选项:

./styli.sh -b
./styli.sh -b bg-scale -r widescreen-wallpaper

添加自定义的 feh 标志:

./styli.sh -c
./styli.sh -c –no-xinerama -r widescreen-wallpaper

自动设置终端的颜色:

./styli.sh -p

使用 nitrogen 而不是 feh:

./styli.sh -n

使用 nitrogen 更新多个屏幕:

./styli.sh -n -m

从一个目录中选择一个随机的背景:

./styli.sh -d /path/to/dir

最后说明

这是一个独特且方便的脚本,内存占用小,可以直接在一个时间间隔内比如一个小时获取图片。让你的桌面看起来 新鲜且高效。如果你不喜欢这些壁纸,你可以简单地从终端再次运行脚本来循环使用。

你喜欢这个脚本吗?或者你知道有什么像这样的壁纸切换器吗?请在下面的评论栏里告诉我。


via: https://www.debugpoint.com/2021/08/change-wallpaper-every-hour/

作者:Arindam 选题:lujun9972 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

让用户用命令行选项调整你的 Java 应用程序运行方式。

 title=

通常向终端中输入命令时,无论是启动 GUI 应用程序还是仅启动终端应用程序,都可以使用 命令行选项 options or switches or flags 以下简称选项)来修改应用程序的运行方式。这是 POSIX 规范 设定的标准,因此能够检测和解析选项对 Java 程序员而言是很有用的技能。

Java 中有若干种解析选项的方法,其中我最喜欢用的是 Apache Commons CLI 库,简称 commons-cli

安装 commons-cli

如果你使用类似 Maven 之类的项目管理系统以及 集成开发环境 Integrated Development Environment (简称 IDE),可以在项目属性(比如 pom.xml 配置文件或者 Eclipse 和 NetBeans 的配置选项卡)中安装 Apache Commons CLI 库。

而如果你采用手动方式管理库,则可以从 Apache 网站下载 该库的最新版本。下载到本地的是几个捆绑在一起的 JAR 文件,你只需要其中的一个文件 commons-cli-X.Y.jar(其中 X 和 Y 代指最新版本号)。把这个 JAR 文件或手动或使用 IDE 添加到项目,就可以在代码中使用了。

将库导入至 Java 代码

在使用 commons-cli 库之前,必须首先导入它。对于本次选项解析的简单示例而言,可以先在 Main.java 文件中简单写入以下标准代码:

package com.opensource.myoptparser;

import org.apache.commons.cli.*;

public class Main {
    public static void main(String[] args) {
    // code 
    }
}

至此在 Java 中解析选项的准备工作已经做好了。

在 Java 中定义布尔选项

要实现解析选项,首先要定义应用程序可接收的有效选项。使用 Option(注意是单数)类来创建选项对象,使用 Options(注意是复数)类来追踪项目中创建的所有选项。

首先为选项创建一个组,按照惯例命名为 options

    //code
    Options options = new Options();

接下来,通过列出短选项(即选项名简写)、长选项(即全写)、默认布尔值(LCTT 译注:设置是否需要选项参数,指定为 false 时此选项不带参,即为布尔选项)和帮助信息来定义选项,然后设置该选项是否为必需项(LCTT 译注:下方创建 alpha 对象的代码中未手动设置此项),最后将该选项添加到包含所有选项的 options 组对象中。在下面几行代码中,我只创建了一个选项,命名为 alpha

    //define options
    Option alpha = new Option("a", "alpha", false, "Activate feature alpha");
    options.addOption(alpha);

在 Java 中定义带参选项

有时用户需要通过选项提供 truefalse 以外的信息,比如给出配置文件、输入文件或诸如日期、颜色这样的设置项值。这种情况可以使用 builder 方法,根据选项名简写为其创建属性(例如,-c 是短选项,--config 是长选项)。完成定义后,再将定义好的选项添加到 options 组中:

    Option config = Option.builder("c").longOpt("config")
        .argName("config")
        .hasArg()
        .required(true)
        .desc("set config file").build();
    options.addOption(config);

builder 函数可以用来设置短选项、长选项、是否为必需项(本段代码中必需项设置为 true,也就意味着用户启动程序时必须提供此选项,否则应用程序无法运行)、帮助信息等。

使用 Java 解析选项

定义并添加所有可能用到的选项后,需要对用户提供的参数进行迭代处理,检测是否有参数同预设的有效短选项列表中的内容相匹配。为此要创建命令行 CommandLine 本身的一个实例,其中包含用户提供的所有参数(包含有效选项和无效选项)。为了处理这些参数,还要创建一个 CommandLineParser 对象,我在代码中将其命名为 parser。最后,还可以创建一个 HelpFormatter 对象(我将其命名为 helper),当参数中缺少某些必需项或者用户使用 --help-h 选项时,此对象可以自动向用户提供一些有用的信息。

    // define parser
    CommandLine cmd;
    CommandLineParser parser = new BasicParser();
    HelpFormatter helper = new HelpFormatter();

最后,添加一些条件判断来分析用户提供的选项,我们假设这些选项已经作为命令行输入被获取并存储在 cmd 变量中。这个示例应用程序有两种不同类型的选项,但对这两种类型都可以使用 .hasOption 方法加上短选项名称来检测选项是否存在。检测到一个存在的选项后,就可以对数据做进一步操作了。

try {
    cmd = parser.parse(options, args);
    if(cmd.hasOption("a")) {
    System.out.println("Alpha activated");
    }

    if (cmd.hasOption("c")) {
    String opt_config = cmd.getOptionValue("config");
    System.out.println("Config set to " + opt_config);
    }
} catch (ParseException e) {
    System.out.println(e.getMessage());
    helper.printHelp("Usage:", options);
    System.exit(0);
}

解析过程有可能会产生错误,因为有时可能缺少某些必需项如本例中的 -c--config 选项。这时程序会打印一条帮助信息,并立即结束运行。考虑到此错误(Java 术语中称为异常),在 main 方法的开头要添加语句声明可能的异常:

public static void main(String[] args) throws ParseException {

示例程序至此就大功告成了。

测试代码

你可以通过调整传递给代码的默认参数来在 IDE 中测试应用程序,或者创建一个 JAR 文件并在终端运行测试。这个过程可能会因 IDE 的不同而不同。具体请参阅相应的 IDE 文档,以及我写过的关于如何创建 JAR 文件的文章,或者参考 Daniel Oh 的关于如何使用 Maven 执行同样操作的文章。

首先,省略必需项 -c--config 选项,检测解析器的异常处理:

$ java -jar dist/myapp.jar                 
Missing required option: c
usage: Usage:
 -a,--alpha             Activate feature alpha
 -c,--config <config>   Set config file

然后提供输入选项再进行测试:

java -jar dist/myantapp.jar --config foo -a
Alpha activated
Config set to foo

选项解析

为用户提供选项功能对任何应用程序来说都是很重要的。有了 Java 和 Apache Commons,要实现这个功能并不难。

以下是完整的演示代码,供读者参考:

package com.opensource.myapp;

import org.apache.commons.cli.*;

public class Main {
    
    /**
     * @param args the command line arguments
     * @throws org.apache.commons.cli.ParseException
     */ 
    public static void main(String[] args) throws ParseException {
        // define options
        Options options = new Options();
        
        Option alpha = new Option("a", "alpha", false, "Activate feature alpha");
        options.addOption(alpha);
        
        Option config = Option.builder("c").longOpt("config")
                .argName("config")
                .hasArg()
                .required(true)
                .desc("Set config file").build();
        options.addOption(config);
     
        // define parser
        CommandLine cmd;
        CommandLineParser parser = new BasicParser();
        HelpFormatter helper = new HelpFormatter();

        try {
            cmd = parser.parse(options, args);
            if(cmd.hasOption("a")) {
                System.out.println("Alpha activated");
            }
          
            if (cmd.hasOption("c")) {
                String opt_config = cmd.getOptionValue("config");
                System.out.println("Config set to " + opt_config);
            }
        } catch (ParseException e) {
            System.out.println(e.getMessage());
            helper.printHelp("Usage:", options);
            System.exit(0);
        }
    }
}

使用 Java 和选项

选项使用户可以调整命令的工作方式。使用 Java 时解析选项的方法有很多,其中之一的 commons-cli 是一个强大而灵活的开源解决方案。记得在你的下一个 Java 项目中尝试一下哦。


via: https://opensource.com/article/21/8/java-commons-cli

作者:Seth Kenlon 选题:lujun9972 译者:unigeorge 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

封面图片选自文森特·梵高的《星空》,公共领域,通过维基共享资源发布

技术世界每天都在变化,对计算机视觉、人工智能和机器学习的需求也在增加。让计算机和手机能够看到周围环境的技术被称为 计算机视觉。这个重新创造人眼的工作始于 50 年代。从那时起,计算机视觉技术有了长足的发展。计算机视觉已经通过不同的应用进入了我们的手机。这篇文章将介绍 Fedora Linux 上的 OpenCV

什么是 OpenCV?

OpenCV( 开源计算机视觉库 Open Source Computer Vision Library )是一个开源的计算机视觉和机器学习软件库。OpenCV 的建立是为了给计算机视觉应用提供一个通用的基础设施,并加速机器感知在商业产品中的应用。它有超过 2500 种优化后的算法,其中包括一套全面的经典和最先进的计算机视觉和机器学习算法。这些算法可用于检测和识别人脸、识别物体、对视频中的人类行为进行分类,并建立标记,将其与增强现实叠加等等。

opencv.org – about

在 Fedora Linux 上安装 OpenCV

要开始使用 OpenCV,请从 Fedora Linux 仓库中安装它:

$ sudo dnf install opencv opencv-contrib opencv-doc python3-opencv python3-matplotlib python3-numpy

注意: 在 Fedora Silverblue 或 CoreOS 上,Python 3.9 是核心提交的一部分。用以下方法安装 OpenCV 和所需工具:

rpm-ostree install opencv opencv-doc python3-opencv python3-matplotlib python3-numpy

接下来,在终端输入以下命令,以验证 OpenCV 是否已经安装:

$ python
Python 3.9.6 (default, Jul 16 2021, 00:00:00)
[GCC 11.1.1 20210531 (Red Hat 11.1.1-3)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2 as cv
>>> print( cv.__version__ )
4.5.2
>>> exit()

当你输入 print 命令时,应该显示当前的 OpenCV 版本,如上图所示。这表明 OpenCV 和 Python-OpenCV 库已经成功安装。

此外,如果你想用 Jupyter Notebook 做笔记和写代码,并了解更多关于数据科学工具的信息,请查看早期的 Fedora Magazine 文章:Fedora 中的 Jupyter 和数据科学

开始使用 OpenCV

安装完成后,使用 Python 和 OpenCV 库加载一个样本图像(按 S 键以 png 格式保存图像的副本并完成程序):

$ cp /usr/share/opencv4/samples/data/starry_night.jpg .
$ python starry_night.py

starry_night.py 的内容:

import cv2 as cv
import sys
img = cv.imread(cv.samples.findFile("starry_night.jpg"))
if img is None:
    sys.exit("Could not read the image.")
cv.imshow("Display window", img)
k = cv.waitKey(0)
if k == ord("s"):
    cv.imwrite("starry_night.png", img)

通过在 cv.imread 函数中添加参数 0,对图像进行灰度处理,如下所示。

img = cv.imread(cv.samples.findFile("starry_night.jpg"),0)

这些是一些可以用于 cv.imread 函数的第二个参数的替代值:

  • cv2.IMREAD_GRAYSCALE0:以灰度模式加载图像。
  • cv2.IMREAD_COLOR** 或1`:以彩色模式载入图像。图像中的任何透明度将被移除。这是默认的。
  • cv2.IMREAD_UNCHANGED** 或-1`:载入未经修改的图像。包括 alpha 通道。

使用 OpenCV 显示图像属性

图像属性包括行、列和通道的数量、图像数据的类型、像素的数量等等。假设你想访问图像的形状和它的数据类型。你可以这样做:

import cv2 as cv

img = cv.imread(cv.samples.findFile("starry_night.jpg"))
print("Image size is", img.shape)
print("Data type of image is", img.dtype)

Image size is (600, 752, 3)
Data type of image is uint8

print(f"Image 2D numpy array \n {img}")

Image 2D numpy array
 [[[0 0 0]
  [0 0 0]
  [0 0 0]
  ...
  [0 0 0]
  [0 0 0]
  [0 0 0]]

 [[0 0 0]
  [0 0 0]
  [0 0 0]
  ...
  • img.shape:返回一个行数、列数和通道数的元组(如果是彩色图像)。
  • img.dtype:返回图像的数据类型。

接下来用 Matplotlib 显示图像:

import cv2 as cv
import matplotlib.pyplot as plt
img = cv.imread(cv.samples.findFile("starry_night.jpg"),0)
plt.imshow(img)
plt.show()

发生了什么?

该图像是作为灰度图像读入的,但是当使用 Matplotlib 的 imshow 函数时,它不一定会以灰度显示。这是因为 imshow 函数默认使用不同的颜色映射。要指定使用灰度颜色映射,请将 imshow 函数的第二个参数设置为 cmap='gray',如下所示:

plt.imshow(img,cmap='gray')

这个问题在以彩色模式打开图片时也会发生,因为 Matplotlib 期望图片为 RGB(红、绿、蓝)格式,而 OpenCV 则以 BGR(蓝、绿、红)格式存储图片。为了正确显示,你需要将 BGR 图像的通道反转。

import cv2 as cv
import matplotlib.pyplot as plt
img = cv.imread(cv.samples.findFile("starry_night.jpg"),cv.IMREAD_COLOR)
fig, (ax1, ax2) = plt.subplots(1,2)
ax1.imshow(img)
ax1.set_title('BGR Colormap')
ax2.imshow(img[:,:,::-1])
ax2.set_title('Reversed BGR Colormap(RGB)')
plt.show()

分割和合并颜色通道

import cv2 as cv
import matplotlib.pyplot as plt

img = cv.imread(cv.samples.findFile("starry_night.jpg"),cv.IMREAD_COLOR)
b,g,r = cv.split(img)

fig,ax = plt.subplots(2,2)

ax[0,0].imshow(r,cmap='gray')
ax[0,0].set_title("Red Channel");
ax[0,1].imshow(g,cmap='gray')
ax[0,1].set_title("Green Channel");
ax[1,0].imshow(b,cmap='gray')
ax[1,0].set_title("Blue Channel");

# Merge the individual channels into a BGR image
imgMerged = cv.merge((b,g,r))
# Show the merged output
ax[1,1].imshow(imgMerged[:,:,::-1])
ax[1,1].set_title("Merged Output");
plt.show()

  • cv2.split:将一个多通道数组分割成几个单通道数组。
  • cv2.merge:将几个数组合并成一个多通道数组。所有的输入矩阵必须具有相同的大小。

注意: 白色较多的图像具有较高的颜色密度。相反,黑色较多的图像,其颜色密度较低。在上面的例子中,红色的密度是最低的。

转换到不同的色彩空间

cv2.cvtColor 函数将一个输入图像从一个颜色空间转换到另一个颜色空间。在 RGB 和 BGR 色彩空间之间转换时,应明确指定通道的顺序(RGB2BGRBGR2RGB)。注意,OpenCV 中的默认颜色格式通常被称为 RGB,但它实际上是 BGR(字节是相反的)。 因此,标准(24 位)彩色图像的第一个字节将是一个 8 位蓝色分量,第二个字节是绿色,第三个字节是红色。然后第四、第五和第六个字节将是第二个像素(蓝色、然后是绿色,然后是红色),以此类推。

import cv2 as cv
import matplotlib.pyplot as plt
img = cv.imread(cv.samples.findFile("starry_night.jpg"),cv.IMREAD_COLOR)
img_rgb = cv.cvtColor(img, cv.COLOR_BGR2RGB)
plt.imshow(img_rgb)
plt.show()

更多信息

关于 OpenCV 的更多细节可以在在线文档中找到。

感谢阅读。


via: https://fedoramagazine.org/use-opencv-on-fedora-linux-part-1/

作者:Onuralp SEZER 选题:lujun9972 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

这个最新发布的通用操作系统已经来到。

期待已久的代号为 “Bullseye” 的 Debian 11 版本在经过两年的开发后终于来了。该版本将在未来五年内得到支持,就像任何其他的 Debian 稳定版版本一样。

感到兴奋吗?让我们来看看 Debian 11 的新内容。

1、新主题

Debian 11 带有一个新的 “Homeworld” 主题。它的灵感来自 包豪斯运动,这是一种 20 世纪初诞生于德国的艺术风格,其特点是对建筑和设计的独特处理。

Debian 11 的默认壁纸

在 Debian 11 中,无论是在登录界面、安装程序还是 Grub 菜单上,你都会看到这个主题。

Grub 屏幕

安装程序

登录屏幕

2、较新版本的桌面环境

Debian 11 包含了它所提供的桌面变体的较新版本:

  • GNOME 3.38
  • KDE Plasma 5.20
  • LXDE 11
  • LXQt 0.16
  • MATE 1.24
  • Xfce 4.16

如果你使用 Fedora 或 Arch/Manjaro 等先锐发行版,你可能会觉得很奇怪。但就是这样。Debian 更倾向于稳定,因此桌面环境的版本不是最新的。当然,它们与之前的 Debian 稳定版相比,还是比较新的。

3、软件包更新

Debian 已经更新了它的软件包库。Debian 11 包括了多达 11294 个新软件包,软件包总数多达 59551 个。42821 个软件包有了新的版本。删除了 9519 个软件包。

也就是说你应该会看到像 LibreOffice、Emacs、GIMP 以及各种服务器和编程相关工具等流行应用程序的新版本。

4、Linux 内核 5.10 LTS

Debian 11 带有 Linux 5.10 内核,这是一个长期支持(LTS)版本。Debian 10 Buster 在发布时使用的是 Linux 4.19 内核。

一个新的内核显然意味着对硬件有更好的支持,特别是较新的硬件以及性能的改进。

5、打印机和扫描器的改进

Debian 11 带来了新的软件包 ipp-usb。它使用了许多现代打印机所支持的供应商中立的 IPP-over-USB 协议。这意味着许多较新的打印机将被 Debian 11 所支持,而不需要驱动程序。

同样地,SANE 无驱动后端可以让你轻松使用扫描仪。

6、支持 exFAT

你不再需要使用 exfat-fuse 包来挂载 exFAT 文件系统。借助 Linux 5.10 内核,Debian 11 已经支持 exFAT 文件系统,并且默认使用它来挂载 exFAT 文件系统。

7、仍然支持 32 位

这算是一个功能吗?考虑到现在只有 少数几个 Linux 发行版支持 32 位架构,我觉得是。

除了 32 位和 64 位 PC,Debian 11 还支持 64 位 ARM(arm64)、ARM EABI(armel)、ARMv7(EABI hard-float ABI,armhf)、小端 MIPS(mipsel)、64 位小端 MIPS(mips64el)、64 位小端 PowerPC(ppc64el)和 IBM System z(s390x)。

现在你知道为什么它被称为“通用操作系统”了吧。 ?

其他变化

在这个版本中还有一些变化:

  • Systemd 默认使用控制组 v2(cgroupv2)。
  • 针对中文、日文、韩文和其他许多语言的新 Fcitx 5 输入法。
  • Systemd 日记日志默认为持久性的。
  • 一个新的打开命令,可以用某个应用程序(GUI 或 CLI)从命令行自动打开文件。
  • 本地系统账户的密码散列现在默认使用 yescrypt 而不是 SHA-512 来提高安全性。

更多信息可以在 官方发布说明 中找到。

获取 Debian 11

Debian 11 可以从其网站下载。只要前往该网站并从那里获得 ISO。

如果你已经在使用 Debian 10,你可以 通过改变你的源列表轻松升级到 Debian 11

享受最新和最棒的通用操作系统吧。?


via: https://news.itsfoss.com/debian-11-feature/

作者:Abhishek 选题:lujun9972 译者:wxy 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出