基于OpenCV与爬虫读取分析官方的动态接口来实现的健康码识别
Notes:
看到 CSDN上 健康码识别 基本都是通过 OpenCV 色块检测 + OCR AI文字识别检测时间 的 方式 来进行 健康码状态的识别。嗯,我感觉…这个好像不是很靠谱….. 毕竟健康码和图片文字是可以伪造的。或者说 如果你用 不久前的 截图 不就可以萌混过关了嘛 。。。ο(=• ω <=)づ☆.。欸嘿~~~所以 我想试试 能不能 通过获取二维码的实际数据来判断 健康码是否是真的健康
所以这里 使用 上海的 随申码 来做样例。
整体步骤:二维码识别 —-> 爬虫获取健康码状态数据 —-> Json 解析成 人看的
1. 环境准备
所需Python模块: <1> pyzbar ----> 二维码解析
<2> requests ----> 爬虫
<3> OpenCV ----> 获取图像
<4> ast ----> 字符串 转 字典
1234from pyzbar import pyzbarimport requestsimport cv2import ast
2 ...
OpenCV-边缘检测
1.步骤
sobel算子模板 2.图片卷积 3.阈值判定
2.源码实现import math
import cv2
import numpy as np
img = cv2.imread("../01_Img/01.jpg", 1)
imgInfo = img.shape
yu = 100
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
dst = np.zeros((imgInfo[0], imgInfo[1], 1), np.uint8)
for i in range(0, imgInfo[0]-2):
for j in range(0, imgInfo[1]-2):
gy = gray[i, j]*1 + gray[i, j+1]*2 + gray[i, j+2]*1 - gray[i+2, j]*1 - gray[i+2, j+1]*2 - gray[i+2, j+2]*1
gx = gray[i, j]*1 - gray[i, j+2]*1 + gray[i+ ...
OpenCV-毛玻璃算法
NOTES
首先让 目标图像 获取 一遍原图像所有像素点的BGR, 因为 该算法实现会导致最外围的 maoRange 为 黑点
其次使 目标图像 使用随机数算法获取 maoRange 内随机一个像素点
maoRange 为 规定的毛玻璃效果范围
1. 马赛克算法import random
import cv2
import numpy as np
img = cv2.imread("../01_Img/01.jpg", 1)
imgInfo = img.shape
dst = np.zeros((imgInfo[0], imgInfo[1], imgInfo[2]), np.uint8)
maoRange = 8
for m in range(0, imgInfo[0]):
for n in range(0, imgInfo[1]):
dst[m, n] = img[m, n]
for m in range(0, imgInfo[0]-maoRange):
for n in range(0, imgInfo[1] ...
OpenCV-马赛克算法
规定m,n 变量为所取马赛克范围
1. 马赛克算法import cv2
import numpy as np
img = cv2.imread("../01_Img/01.jpg", 1)
imgInfo = img.shape
for m in range(100, 150):
for n in range(100, 150):
if m%10 == 0 and n%10 == 0:
for i in range(0, 10):
for j in range(0, 10):
(b, g, r) = img[m, n]
img[i+m, j+n] = (b, g, r)
cv2.imshow("dst", img)
cv2.waitKey(0)
OpenCV-颜色反转算法
导读
灰度图像颜色反转
彩色图像颜色反转
1. 灰度图像颜色反转import cv2
import numpy as np
img = cv2.imread("../01_Img/01.jpg", 1)
imgGray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
imgInfo = img.shape
dst = np.zeros((imgInfo[0], imgInfo[1], 1), np.uint8)
for i in range(0, imgInfo[0]):
for j in range(0, imgInfo[1]):
dst[i, j] = 255-imgGray[i, j]
cv2.imshow("", dst)
cv2.waitKey(0)
2. 彩色图像颜色反转import cv2
import numpy as np
img = cv2.imread("../01_Img/01.jpg", 1)
imgInfo = img.sha ...
OpenCV-灰度算法[API与源码实现]
导读
API调用(2个方法)
源码实现法(2个方法)
API调用API调用法1 —-> imread 改参import cv2
import numpy as np
img = cv2.imread("../01_Img/01.jpg", 0)
cv2.imshow("", img)
cv2.waitKey(0)
API调用法2 —-> cvtColor 函数import cv2
import numpy as np
# 方法2 ----> cvtColor 函数
img = cv2.imread("../01_Img/01.jpg", 1)
dst = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cv2.imshow("", dst)
cv2.waitKey(0)
源码实现源码实现法1 —-> 均值法import cv2
import numpy as np
img = cv2.imread("../01_Img/01. ...
OpenCV-图片缩放算法[双线性插值法]
双线性插值法举例:Note: 百分之多少看小数点A1 = 20% * 上方的点 + 80% * 下方的点A2 同上B1 = 30% * 左边的点 + 70% * 右边的点B2 同上最终点 = A1 * 30% + A2 * 70%最终点 = B1 * 20% + B2 * 80%
OpenCV-图片缩放算法[最近领域插值法]
最近领域插值法img.jpg = 1020 —-> dst_img.jpg = 510功能:图片缩放案例: dst_img(1, 2) <—- img(2, 4) dst_img的x=1 来自 img的x=2 原图像的 x = 目标图像的 x*(原图像的行/目标图像的行) —-> 原图像的 2 = 目标图像的 1*(10/5) 原图像的 y = 目标图像的 y*(原图像的列/目标图像的列) —-> 原图像的 4 = 目标图像的 2*(20/10) 如果 x 或 y = 浮点型, 则结果化为整型 —-> 原图像的 x = 114.514 = 目标图像的 x = 114
Python 源码实现:
import cv2
import numpy as np
img = cv2.imread("../01_Img/01.jpg", 1)
imgInfo = img.shape
img_height, img_width, img_mode = imgInfo
dst_height = int(img ...
<浙大>数据结构·1.4栈的链表储存[线性结构]
1.4栈的链表储存[线性结构]
栈的链式存储结构实际上就是一个单链表,叫做链栈。插入和删除操作只能在链栈的栈顶进行。
主要操作的实现:#include <iostream>
#include <algorithm>
using namespace std;
// 1.4栈的链表储存[线性结构]
#define MAXSIZE 100 // 堆栈元素的最大个数
typedef int ElementType; // ElementType 暂时定义为 int 类型
typedef struct SNode *Stack;
struct SNode{
ElementType Data; // 存储堆栈元素
Stack Next; // 记录栈顶元素下标
};
Stack CreateStack(); // 初始化链栈
int IsEmpty(Stack S); // 判断链栈是否为空
void Push(Stack S,ElementType item); // 入栈
ElementType ...
<浙大>数据结构·1.3栈的顺序储存[线性结构]
1.3栈的顺序储存[线性结构]
栈的顺序存储结构通常由一个一维数组和一个记录栈顶元素位置的变量组成
主要操作的实现:#include <iostream>
#include <algorithm>
using namespace std;
// 1.3栈的顺序储存[线性结构]
#define MAXSIZE 100 // 堆栈元素的最大个数
typedef int ElementType; // ElementType 暂时定义为 int 类型
typedef struct SNode *Stack;
struct SNode{
ElementType Data[MAXSIZE]; // 存储堆栈元素
int Top; // 记录栈顶元素下标
};
Stack CreateStack(); // 初始化堆栈
int IsFull(Stack S); // 判断堆栈是否已满
int IsEmpty(Stack S); // 判断堆栈是否为空
void Push(Stack S,Element ...