OpenCV从入门到放弃

开篇致谢最为致命,首先感谢大佬81页计算机视觉指南

最近公司比较闲,本来应该去刷LeetCode的,但是刷自闭了,于是技能树继续向广度发展,正巧前两天看到这个指南了,于是就学着玩玩。

第一步当然是搞一台linux虚拟机,这里我选择了ubuntu Desktop版,然后是安装python,OpenCV库。


sudo apt-get update && sudo apt-get install python3-pip
# 升级
python3 -m pip install --upgrade pip
# 换源
python3 -m pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
python3 -m pip install opencv-python imutils

给你们瞅一眼我的目录结构

然后就是跟着教程练习几个常用函数的使用,以下代码不保证可运行,这里我建议用python交互模式练习,用文件形式有点麻烦


import imutils
import cv2
# 这个图片是Pixiv找的,教程上的图我没找到,有一说一,这图画的很好
# 这张图目前没什么要求,有想要圈起来的东西就行
image=cv2.imread("78172570_p0.jpg")
(h,w,d)=image.shape
print("width={},height={},depth={}".format(w,h,d))

cv2.imshow("Image",image)
cv2.waitKey(0)
(B,G,R)=image[100,50]
print("RGB at 100,50:{},{},{}".format(R,G,B))

roi=image[300:450,450:600]
cv2.imshow("ROI",roi)
cv2.waitKey(0)

resized=cv2.resize(image,(720,720))
cv2.imshow("Fixed Resizing",resized)
cv2.waitKey(0)

r=720.0/w
dim=(720,int(h*r))
resized=cv2.resize(image,dim)
cv2.imshow("Aspect Ratio Resize",resized)
cv2.waitKey(0)
resized=imutils.resize(image,height=720)
(h_l,w_l,d_l)=resized.shape
cv2.imshow("Imutils Resize",resized)
cv2.waitKey(0)

center=(w_l//2,h_l//2)
M=cv2.getRotationMatrix2D(center,-45,1.0)
rotated=cv2.warpAffine(resized,M,(w_l,h_l))
cv2.imshow("OpenCV Rotation",rotated)
cv2.waitKey(0)

rotated=imutils.rotate_bound(resized,45)
cv2.imshow("Imutils Bound Rotation",rotated)
cv2.waitKey(0)
#高斯模糊……
blurred=cv2.GaussianBlur(resized,(11,11),0)
cv2.imshow("Blurred",blurred)
cv2.waitKey(0)

output=image.copy()
#output 左上(x,y),右下(x,y)
#我们最常在新闻上看到的长方形
cv2.rectangle(output,(450,300),(600,450),(0,0,255),2)
cv2.imshow("Rectangle",output)
cv2.waitKey(0)

output=image.copy()
#画圈
cv2.circle(output,(525,375),75,(255,0,0),1)1 for 1px,-1 for solid
cv2.imshow("Circle",output)
cv2.waitKey(0)

output=image.copy()
#划线
cv2.line(output,(725,0),(725,500),(0,0,255),3)
cv2.imshow("Line",output)
cv2.waitKey(0)

output=image.copy()
#写字
cv2.putText(output,"EnderCaster Exercise",(10,25),cv2.FONT_HERSHEY_SIMPLEX,0.7,(255,204,102),2)
cv2.imshow("Text",output)
cv2.waitKey(0)

第一部分的基础练习就完了,然后是抠图图像处理


import cv2
import imutils
import argparse
# 同样是Pixiv找的,这张图的要求是背景单一,角色没有关联
image=cv2.imread("split_test.jpg")
cv2.imshow("Image",image)
cv2.waitKey(0)

# 灰度图
gray=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
cv2.imshow("Gray",gray)
cv2.waitKey(0)
# 边缘查找
edge=cv2.Canny(gray,30,150)
cv2.imshow("Edge",edge)
cv2.waitKey(0)

# that not work well
# 阈值,用灰阶图处理效果比较好
thresh=cv2.threshold(gray,242,255,cv2.THRESH_BINARY_INV)[1]
cv2.imshow("Threshold",thresh)
cv2.waitKey(0)

# 看名称像是查找封闭区间,所以上一步没处理好这里可能会多出来一些无效的
cnts=cv2.findContours(thresh.copy(),cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
cnts=imutils.grab_contours(cnts)
output=image.copy()
for c in cnts:
    cv2.drawContours(output,[c],-1,(240,0,159),3)
    cv2.imshow("Contours",output)
    cv2.waitKey(0)
# Rita 人名
text="I found {} Rita!".format(len(cnts))
cv2.putText(output,text,(20,25),cv2.FONT_HERSHEY_SIMPLEX,0.7,(240,0,159),2)
cv2.imshow("Contours",output)
cv2.waitKey(0)
# 去噪
## 腐蚀
## 裁切式...这个去的有点猛
mask=thresh.copy()
mask=cv2.erode(mask,None,iterations=1)
cv2.imshow("Eroded",mask)
cv2.waitKey(0)
## 膨胀
## 扩展式
mask=thresh.copy()
mask=cv2.dilate(mask,None,iterations=3)
cv2.imshow("Dilated",mask)
cv2.waitKey(0)
# 按位与,慎用,效果比较令人迷惑
mask=thresh.copy()
output=cv2.bitwise_and(image,image,mask=mask)
cv2.imshow("Output",output)
cv2.waitKey(0)

bilibili视频批量下载

!important 本文以讲述原理为主,不发布可直接执行的代码

由于经常出现我今天看了第二天视频就没了的情况,所以特别喜欢的视频我都会down下来保存到本地,当然三连给up是肯定的,网上已经有不少可以直接下载的插件了(特别是chrome插件,但是批量下载还是得手动来。

所以我们先来了解一下怎么手动下载B站视频

此处以我的一个视频为例(gank钓鱼网站)原料如下

  • Google Chrome/Firefox(PC端)
  • aria2c (是的,下载怎么能少了它呢
  • curl
  • 代码执行环境(如cmd/powershell/bash

首先打开页面,按F12打开调试窗口,刷新(因为我需要用到sources中的内容,不刷新通常拦截不到)此时打开“网络”选项卡,你会看见密密麻麻的一堆网络请求地址,像下面这样

网络请求

先排除掉资源文件,比如字体,css,js,因为视频音频数据基本不可能存在这些文件中,所以可疑的数据就只剩下两条了:那两个m4s的xhr请求(就是我们平常说的ajax请求)

接下来要做什么已经显而易见了,打开“源”选项卡,找到这个页面

看见这个index了吗?点它,这就是当前页面的源文件(并非你看到的这个页面,因为你看到的这个页面是经过js和css处理过的),顺便按一下左下角的大括号,美化代码,ctrl+f搜索刚才看见的那两个m4s,可以发现他们在一个__playinfo__的json里

第一次找到的时候我其实是很震惊的,B站这个播放器的音频和视频是分开的,这两条url也就是我们要找的下载地址了

你以为这就结束了?没有!

直接使用aria2c 下载会报错,用curl查看提示403forbidden,既然B站下载可以,那我们让请求参数更像B站的下载请求就行了啊,这里直接说结果:加上–refer参数,refer是指你在哪个页面请求的这个地址,对应的是网络请求的header中的refer,所以完整的命令是

aria2c –refer=’base_url’ ‘video/audio url’

至此,手动下载的部分说完了,下面的内容就简单很多了

批量下载适用于解放手工劳动的,如果批量也这么下那可太麻烦了,批量下载一般会在程序中直接下载,甚至连视频音频的合并都做了,但是我懒(

于是我采用的是类似于爬虫的思路,只爬取url,使用url生成下载命令并保存为文件,当前的批量下载针对多个分p的,分p的获取在查看源那一步搜索分P标题就可以找到一个名为 __INITIAL_STATE__ 的json,分p在pages数组里,其它参数这里暂时用不到

b站视频播放的url有一个p参数,就是分p序号,所以我们令max=len(pages),来循环获取每一p的url(p=i+1),把生成的command写到文件中就万事大吉了

为了方便区分文件内容,来认识一下aria2c的-o参数,指的是下载文件名,在生成下载命令的时候带上这个参数能够让文件更便于区分。

那么这篇文章到此结束,欢迎来B站找我@EnderCaster

有道智云文本翻译

最近需要用到在线翻译,就找了一个初期免费(送100初始资金)的站,而且有道这个网站主要就是做翻译的,质量应该还是信得过

请求示例:


import random, string, config

def randomword(length):
    letters = string.ascii_lowercase
    return ''.join(random.choice(letters) for i in range(length))

appSecret=config.appSecret

q="<待翻译文本>"
from="en"
to="zh-CHS"
appKey=config.appKey
salt=randomword(<任意长度>)
sign=md5(appKey+q+salt+appSecret) #格式要求:%32X

返回示例


{
    "tSpeakUrl": "",
    "web": [
        {
            "value": [
                "lunar eclipse",
                "Eclipse",
                "moon's eclipse"
            ],
            "key": "月食"
        },
        {
            "value": [
                "penumbral lunar eclipse",
                "penumbral eclipse",
                "appulse"
            ],
            "key": "半影月食"
        },
        {
            "value": [
                "moon phases"
            ],
            "key": "月食字体"
        }
    ],
    "query": "月食",
    "translation": [
        "Eclipse of the moon"
    ],
    "errorCode": "0",
    "dict": {
        "url": "yddict://m.youdao.com/dict?le=eng&q=%E6%9C%88%E9%A3%9F"
    },
    "webdict": {
        "url": "http://m.youdao.com/dict?le=eng&q=%E6%9C%88%E9%A3%9F"
    },
    "basic": {
        "phonetic": "yuè shí",
        "explains": [
            "[天] eclipse of the moon",
            "[天] lunar eclipse"
        ]
    },
    "l": "zh-CHS2en",
    "speakUrl": ""
}