Перевод текста на русский язык:
import picamera
import time
# sudo pip3 install和pip3 install的路径不一样,所以pip3 isntall安装的包jupyter访问不到
import sys
sys.path.append('/home/pi/.local/lib/python3.5/site-packages') # 所以要加上这一句
import numpy as np
import matplotlib.pyplot as plt
import cv2
import matplotlib.cm as cm # 用于在特定颜色映射中显示图像
from skimage.measure import compare_ssim
import argparse
import imutils
# 树莓派500万像素的摄像头
# 全分辨率图像,主要是为了后期输出
img = np.empty((1920 * 2560 * 3,), dtype=np.uint8)
img2 = np.empty((1920 * 2560 * 3,), dtype=np.uint8)
with picamera.PiCamera() as camera:
camera.resolution = (2560, 1920)
camera.framerate = 10
time.sleep(10)
camera.capture(img, 'bgr') # opencv用BGR
img = img.reshape((1920, 2560, 3))
time.sleep(5) # 5秒后拍摄第二张
camera.capture(img2, 'bgr') # opencv用BGB
img2 = img2.reshape((1920, 2560, 3))
# Низкоразрешение изображения
img = np.empty((240 * 320 * 3,), dtype=np.uint8)
img2 = np.empty((240 * 320 * 3,), dtype=np.uint8)
with picamera.PiCamera() as camera:
camera.resolution = (320, 240)
camera.framerate = 10
time.sleep(10)
camera.capture(img, 'bgr') # opencv用BGR
img = img.reshape((240, 320, 3))
time.sleep(5)
camera.capture(img2, 'bgr') # opencv用BGR
img2 = img2.reshape((240, 320, 3))
img=cv2.imread('image.png')
img2=cv2.imread('image2.png')
# Вывод изображения
plt.figure(figsize=(10,5))
plt.subplot(1,2,1)
plt.imshow(img[...,::-1]) # 转RGB
plt.title('pic1')
plt.subplot(1,2,2)
plt.imshow(img2[...,::-1])
plt.title('pic2')
Text(0.5, 1.0, 'pic2')
# Сохранение изображения
cv2.imwrite('image.png', img)
cv2.imwrite('image2.png', img2)
# Масштабирование
image=cv2.resize(img, (320, 240), interpolation=cv2.INTER_CUBIC)
image2=cv2.resize(img2, (320, 240), interpolation=cv2.INTER_CUBIC)
# Перевод в оттенки серого
image=cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
image2=cv2.cvtColor(image2, cv2.COLOR_BGR2GRAY)
# Гауссово размытие, может значительно уменьшить влияние шума
image = cv2.GaussianBlur(image, (5, 5), 0)
image2 = cv2.GaussianBlur(image2, (5, 5), 0)
В условиях яркого освещения и высокого контраста кажется не очень надёжным
# Вычисление абсолютной разности
image3=cv2.absdiff(image,image2)
# Бинаризация
image3 = cv2.threshold(image3, 25, 255, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)[1]
print('Different pixels:',image3[image3=0].size,'of',image3.size)
diffRate=image3[image3=0].size/image3.size
print('DiffRate=',diffRate)
if diffRate>0.01:
print('They are different.')
else:
print('They are same.')
Different pixels: 4112 of 76800
DiffRate= 0.0535416666666667
They are different.
# Вывод сравнительного изображения
plt.figure(figsize=(14,6))
plt.subplot2grid((1,3),(0,0))
plt.imshow(image)
plt.title('pic1')
plt.subplot2grid((1,3),(0,1))
plt.imshow(image2)
plt.title('pic2')
plt.subplot2grid((1,3),(0,2))
plt.imshow(image3)
plt.title('diff')
Text(0.5, 1.0, 'diff')
Тип порога | Пиксели меньше порога | Пиксели больше порога |
---|---|---|
0 | Установить 0 | Установить цвет заливки |
1 | Установить цвет заливки | Установить 0 |
2 | Сохранить исходный цвет | Установить серый цвет |
3 | Установить 0 | Сохранить исходный цвет |
4 | Сохранить оригинальный цвет | Установить 0 |
Обратите внимание, что функция findcontours будет «на месте» изменять входное изображение.
cv2.CHAIN_APPROX_SIMPLE сжимает элементы в горизонтальном, вертикальном и диагональном направлениях, сохраняя только конечные координаты точек в данном направлении. Например, для сохранения контура прямоугольника достаточно 4 точек.
изображение, текстовое содержимое, координаты, шрифт, размер, цвет, толщина шрифта
# вычисление ssim
(оценка, разница) = compare_ssim(изображение, изображение2, полный = True)
разница = (разница * 255).astype("uint8")
print("SSIM:{}".format(оценка))
SSIM:0.9140822389861617
plt.figure(figsize=(6,4))
plt.imshow(разница, cmap="gray")
plt.colorbar()
<matplotlib.colorbar.Colorbar at 0x6523fc70>
# найти контур
если оценка > 0,98:
okText='Same'
print(okText)
else:
okText='Different'
# бинаризация найти контуры разных точек
порог = cv2.threshold(разница, 25, 255, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)[1]
# расширить пороговое изображение заполнить отверстия, затем найти контуры на пороговом изображении
порог = cv2.dilate(порог, None, итерации=2)
cnts = cv2.findContours(порог.copy(),cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if imutils.is_cv2() else cnts[1]
шрифт = cv2.FONT_HERSHEY_SIMPLEX
imgzi = cv2.putText(порог, okText, (10, 230), шрифт, 1, (255, 255, 255), 1) # изображение, текстовое содержание, координаты, шрифт, размер, цвет, толщина шрифта
plt.figure(figsize=(6,4))
plt.imshow(imgzi)
# использовать прямоугольники для выделения разных точек
для c в cnts:
(x, y, w, h) = cv2.boundingRect(c)
cv2.rectangle(image2,(x,y),(x+w,y+h),(255,255,255),1)
image2 = cv2.putText(image2, okText, (10, 230), font, 1, (255, 255, 255), 1)
# вывод результатов
plt.figure(figsize=(10,5))
plt.subplot2grid((1,2),(0,0))
plt.imshow(изображение)
plt.title('pic1')
plt.subplot2grid((1,2),(0,1))
plt.imshow(image2)
plt.title('pic2')
Text(0.5, 1.0, 'pic2')
# вывести полное сравнение изображений
изображение=img
изображение2=img2
для c в cnts:
(x,y,w,h) = cv2.boundingRect(c)
x*=8
y*=8
w*=8
h*=8
cv2.rectangle(image2,(x,y),(x+w,y+h),(0,0,255),10)
cv2.rectangle(изображение,(x,y),(x+w,y+h),(0,0,255),10)
# вывод результата
plt.figure(figsize=(10,5))
plt.subplot2grid((1,2),(0,0))
plt.imshow(изображение[...,::-1])
plt.title('pic1')
plt.subplot2grid((1,2),(0,1))
plt.imshow(изображение2[...,::-1])
plt.title('pic2')
Text(0.5, 1.0, 'pic2')
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )