目录

作者: admin

群晖 Transmission 升级 4.x 更新中文 UI 面板命令

依次执行下列命令即可:

cd /var/packages/transmission/target/share/transmission/
wget https://ghproxy.com/https://github.com/transmission-web-control/transmission-web-control/releases/download/v1.6.31/dist.zip
7z x dist.zip
cp -rf dist/* public_html/
rm -rf dist dist.zip
chown -R sc-transmission:synocommunity public_html

你就会得到如下的中文界面:

解决升级 plex 后证书无法使用的问题(plex 版本1.32.0.6918)

我这里是使用的阿里云的免费证书,引起该问题的主要原因是 plex 这次的版本升级更换为更严格的ssl校验版本,需要使用 openssl 重新生成你的证书。

这次版本升级官方论坛也出现了大量讨论升级后证书无法使用的问题:https://forums.plex.tv/t/plex-media-server-1-32-0-6918-custom-certificate-must-be-regenerated-with-new-openssl-arguments/837643

解决办法:

  1. 下载 pem 、key 证书文件(我这里在阿里云免费证书下载的,选择 nginx 版本即可)
  2. 电脑安装 OpenSSL 工具(Windows OpenSSL 下载地址
  3. 打开 OpenSSL 工具,执行以下命令:
openssl pkcs12 -export -out your_new.pfx -certpbe AES-256-CBC -keypbe AES-256-CBC -macalg SHA256 -inkey your.key -in your.pem -password pass:xxxx

其中 your.key 和 your.pem 文件名称写为你下载的证书文件名,末尾 pass:xxxx ,xxxx 填写为新生成证书的密码,然后即可完成生成一个 your_new.pfx 的证书,将他关联到你的 plex 中即可。

群晖 NAS 配置 Gitlab Docker 并启用 HTTPS 和 Email

一、基本要求

(1)内存:群晖一般出厂的内存都比较小,一般为 2~4GB,即便是我目前使用的 1821+ 的设备也出厂只有仅仅 4GB。Gitlab 的安装基本上要完全占用掉 4GB 左右,所以在安装之前,建议先将机器的内存升级到8GB以上。

(2)群晖型号:需要支持 Docker 即可。

二、在 Docker 中安装 Gitlab

(1)首先打开 Docker 应用,在“注册表”菜单中,搜索 gitlab-ce 关键字,即可找到 gitlab/gitlab-ce 这个镜像包,双击进行下载(版本选择 latest 即可)。

(2)在菜单“映像”列表中,双击 gitlab/gitlab-ce:latest 进行下载安装,安装完成之后即可双击启动配置。

(3)我这里是在 Nas 中的 docker 文件夹新建了一个 gitlab 目录及 三个子目录 config、data、logs 映射到对应的 Docker 路径。需要注意的是 gitlab 目录及子目录一定要授权给 http、Everyone、guest 完整的控制权限。

(4)端口按照如上配置即可,当然你也可以修改成自己定义的端口号、以及文件存储映射的路径。另外我新增了一个 TZ 的环境变量来设定 Docker 运行的 时区。其它的保持默认即可。

(5)在浏览器地址栏输入http://ip:5480就进入到系统界面了。

(6)在这个文件中,我们可以找到 gitlab 默认用户 root 的登录密码,即可登录(需要在 24 小时内修改密码)。至此,就完成了 gitlab 的安装。

三、Gitlab HTTPS 配置

(1)首先你得有一个域名以及它对应 NGINX 的 SSL 证书,我这里是使用阿里云的免费证书,到阿里云申请及下载即可。(如果你还没有这个证书,具体流程可以百度一下其它的文章进行学习并生成你的证书。)

(2)下载证书后,在 NAS 的 docker/gitlab/config 目录中,新建 ssl 目录,将证书文件(*.pem, *.key) 两个文件放入该目录。

(3)然后在群晖的 docker/gitlab/config 目录中找到 gitlab.rb 文件进行下载并进行文本编辑。

external_url 'https://x.x.x:5443'
nginx['enable'] = true
nginx['client_max_body_size'] = '250m'
nginx['redirect_http_to_https'] = true
nginx['redirect_http_to_https_port'] = 80

nginx['ssl_certificate'] = "/etc/gitlab/ssl/x.x.x.pem"
nginx['ssl_certificate_key'] = "/etc/gitlab/ssl/x.x.x.key"
nginx['ssl_ciphers'] = "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384"

(4)文件默认是前面加了 # 号进行了注释,我们将注释去除,并参考如上信息进行编辑即可。编辑完成后,将该文件传回 NAS 进行覆盖原有的文件即可。(建议覆盖之前先备份一次默认配置文件)

(5)这里需要通过 SSH 登录到群晖的终端,输入命令 docker exec -it gitlab-ce-zh /bin/bash 以进入该镜像。

然后依次执行命令:
gitlab-ctl reconfigure
gitlab-ctl restart

等待脚本执行完成即可。

四、Gitlab Email (SMTP)发信配置

(1)配置 Gitlab 的邮件发送,依旧在 docker/gitlab/config/gitlab.rb 文件中进行配置,可以在本地通过 VSCode 之类文本编辑工具配置完成后,传上去。我的配置如下:

gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = "smtp.qq.com"
gitlab_rails['smtp_port'] = 465
gitlab_rails['smtp_user_name'] = "填写你的邮箱账号,如xxx@qq.com"
gitlab_rails['smtp_password'] = "填写你的smtp密码"
gitlab_rails['smtp_domain'] = "qq.com"
gitlab_rails['smtp_authentication'] = "login"
gitlab_rails['smtp_enable_starttls_auto'] = true
gitlab_rails['smtp_tls'] = true

gitlab_rails['gitlab_email_from'] = '要显示的发件人Email地址'
gitlab_rails['gitlab_email_display_name'] = '要显示的发件人Email名称'

这里以 QQ 邮箱为例,需要到邮箱设置中,开启 SMTP 功能。其它邮箱大同小异。

(2)邮箱测试方式如下:

# 重启配置
gitlab-ctl reconfigure
gitlab-ctl restart 
# 进入控制台(等待进入控制台)
gitlab-rails console
# 执行测试
Notify.test_email("接收邮箱","标题","内容").deliver_now

OpenCV-Python 获取近似轮廓

根据上一篇文章,我们简单的获取了轮廓的所有坐标点,实际上也许我们只需要局部的几个坐标点即可,如下图所示:

原图
以数值0.1精度取得 4 个点
以 0.01 精度取得多个点
直接注释代码,获得所有点

代码如下所示:

import numpy as np
import cv2 as cv

# 读取图片
im = cv.imread('test_img.png')
imgray = cv.cvtColor(im,cv.COLOR_BGR2GRAY)

# 获取轮廓
ret, thresh = cv.threshold(imgray,127,255,0)
contours, hierarchy = cv.findContours(thresh, cv.RETR_TREE,cv.CHAIN_APPROX_SIMPLE)

# 注释以下代码,或 调整数值 “0.1” 以获得不同的精度
epsilon = 0.01*cv.arcLength(contours[0],True)
contours = cv.approxPolyDP(contours[0],epsilon,True)


# 展示
cv.drawContours(im,contours, -1,(0,255,0),3)
cv.imshow('result',im)
cv.waitKey(0)

# 释放资源
cv.destroyAllWindows()

示例代码打包下载:

参考原文:https://docs.opencv.org/4.5.5/dd/d49/tutorial_py_contour_features.html

OpenCV-Python 获取图像轮廓坐标点

原图
运行结果

原理:将图片转为灰度图,取得其轮廓。轮廓可以简单地解释为连接所有连续点(沿边界)的曲线,具有相同的颜色或强度。轮廓是形状分析和对象检测和识别的有用工具。

代码如下:

import numpy as np
import cv2 as cv

# 读取图片
im = cv.imread('test.png')
imgray = cv.cvtColor(im,cv.COLOR_BGR2GRAY)

# 获取轮廓
ret, thresh = cv.threshold(imgray,127,255,0)
contours, hierarchy = cv.findContours(thresh, cv.RETR_TREE,cv.CHAIN_APPROX_SIMPLE)

# 展示
cv.drawContours(im,contours, -1,(0,255,0),3)
cv.imshow('result',im)
cv.waitKey(0)

# 释放资源
cv.destroyAllWindows()

代码中的 test.jpg 可以直接在本文中找到,另存为和代码一同运行即可得到如上效果

参考原文:https://docs.opencv.org/4.5.5/d4/d73/tutorial_py_contours_begin.html

OpenCV-Python 获取特定颜色范围内的图像区域

本示例运行需要计算机配置有摄像头,如果您没有摄像头也没有关系,可以改变cap = cv.VideoCapture(0)代码,读取一段视频文件来演示也是可以的。

将 BGR 图像转换为 HSV,我们可以使用它来提取彩色对象。在 HSV 中,表示颜色比在 BGR 颜色空间中更容易。在我们的应用程序中,我们将尝试提取蓝色对象。所以这里是方法:

  • 拍摄视频的每一帧
  • 从 BGR 转换为 HSV 颜色空间
  • 我们将 HSV 图像阈值设置为蓝色范围
  • 现在单独提取蓝色对象,我们可以在该图像上做任何我们想做的事情。

示例代码如下:

import cv2 as cv
import numpy as np

cap = cv.VideoCapture(0)

while(1):
    # 获取每一帧数据
    _, frame = cap.read()

    # 将图像从 BGR 转 HSV
    hsv = cv.cvtColor(frame, cv.COLOR_BGR2HSV)

    # 定义 HSV 中的黄色范围
    lower_blue = np.array([110,50,50])
    upper_blue = np.array([130,255,255])

    # 对 HSV 图像设置阈值,使其只显示蓝色
    mask = cv.inRange(hsv, lower_blue, upper_blue)

    # 使用 mask 遮罩层显示图像
    res = cv.bitwise_and(frame,frame, mask=mask)

    cv.imshow('frame', frame)
    cv.imshow('mask', mask)
    cv.imshow('res',res)
    k = cv.waitKey(5) % 0xFF
    if k == 27:
        break

cv.destroyAllWindows()

如何获取一个HSV值

我们可以通过 python 终端直接将一个 BGR 值,转换为 HSV 值,示例如下:

>>> green = np.uint8([[[0,255,0 ]]])
>>> hsv_green = cv.cvtColor(green,cv.COLOR_BGR2HSV)
>>> print( hsv_green )
[[[ 60 255 255]]]

参考原文:https://docs.opencv.org/4.5.5/df/d9d/tutorial_py_colorspaces.html

OpenCV-Python 获取一段代码运行的所消耗的时间

在图像处理中,由于您每秒处理大量操作,因此您的代码不仅要提供正确的解决方案,而且还要以最快的方式提供解决方案,通过 OpenCV 自带的函数可以进行时间差计算,示例代码如下:

import cv2 as cv

# 获取当前时间(1)
e1 = cv.getTickCount()

# 你的一些耗时的代码
for i in range(10000):
    print(i)

# 获取当前时间(2)
e2 = cv.getTickCount()
# 计算时间差
time = (e2 - e1) / cv.getTickFrequency()

# 打印耗时
print('耗时(秒)',time)

运行效果如下:

....
9996
9997
9998
9999
耗时(秒) 0.6926358

OpenCV-Python 抠图,并将抠出的图重叠到另一张图片中

主要工作原理为将图置为灰度图,根据阈值取出相应的灰度值转换为0 或 1(非黑即白)的图像,然后对黑或白区域进行抠图取得区域,然后进行抠图。效果如下:

实现代码如下:

import cv2 as cv

# 加载两张图片
img1 = cv.imread('messi.jpeg')
img2 = cv.imread('opencv-logo.png')

# 我希望把 LOGO 防止到左上角,所以创建了一个区域(roi)
rows,cols,channels = img2.shape
roi = img1[0:rows, 0:cols]

# 将 LOGO 图转换为灰度图,阈值为 10, 最大值为 255 
img2gray = cv.cvtColor(img2,cv.COLOR_BGR2GRAY)
ret, mask = cv.threshold(img2gray, 10, 255, cv.THRESH_BINARY)
mask_inv = cv.bitwise_not(mask)

# 现在将 ROI 抠出黑色区域
img1_bg = cv.bitwise_and(roi,roi,mask = mask_inv)

# 抠出 LOGO 图像
img2_fg = cv.bitwise_and(img2,img2,mask = mask)

# 将抠出的 LOGO 防入 ROI 区域中
dst = cv.add(img1_bg,img2_fg)
img1[0:rows, 0:cols ] = dst

# 显示图像
cv.imshow('res',img1)

# 退出,并释放资源
cv.waitKey(0)
cv.destroyAllWindows()

本文示例完整代码下载;

OpenCV-Python 图像混合(图像加权法)

这也是图像添加,但为图像赋予不同的权重,以产生混合或透明的感觉。

示例代码如下:

import cv2 as cv

# 读取图像文件
img1 = cv.imread('ml.png')
img2 = cv.imread('opencv-logo.png')

# 图像重叠
dst = cv.addWeighted(img1,0.3,img2,0.7,0)

# 显示图像
cv.imshow('dst',dst)
cv.waitKey(0)

# 退出程序,释放资源
cv.destroyAllWindows()

这里设置了第一张图片的权重为 0.3, 第二张图片为 0.7 所混合出来的效果。(注意是权重混合,并不是透明度设置,具体可参考官方文档:https://docs.opencv.org/4.5.5/d2/de8/group__core__array.html#gafafb2513349db3bcff51f54ee5592a19)

示例代码下载:

Python 获取或修改图像的像素颜色值

您可以通过其行(X)和列坐标(Y)访问或修改像素值。对于 BGR 图像,它返回一个包含蓝色、绿色、红色值的数组。对于灰度图像,只返回相应的强度。

示例代码如下:

import numpy as np
import cv2 as cv

img = cv.imread('messi.jpg')

# 你可以在此填写图像的 X、Y 坐标,获得该图像的 BGR 数据,如果是灰度图像,只返回该灰度的数值。
px = img[100,100]
print('获取X100,Y100坐标的 BGR 数值',px)

# 只访问蓝色的数值
blue = img[100,100,0]
print('获取X100,Y100坐标的蓝色数值',blue)

# 可以使用相同的方式修改像素值
img[100,100] = [255,255,255]
print('获取X100,Y100坐标已修改的 BGR 数值',img[100,100])

# 使用以上方式进行像素值修改,性能非常缓慢,并不鼓励这样做,更好的像素访问与修改的方法如下:
# 访问 Red 值(B=0,G=1,R=2)
fast_px = img.item(200,200,2)
print('更快的获取X200,Y200坐标的 BGR 数值',fast_px)

# 修改 Red 值
img.itemset((200,200,2), 100)
print('获取已修改的X200,Y200坐标的 Red 数值',img.item(200,200,2))

运行结果如下:

获取X100,Y100坐标的 BGR 数值 [57 63 68]
获取X100,Y100坐标的蓝色数值 57
获取X100,Y100坐标已修改的 BGR 数值 [255 255 255]
更快的获取X200,Y200坐标的 BGR 数值 105
获取已修改的X200,Y200坐标的 Red 数值 100

代码打包下载: