Если элемент, к которому вы пытаетесь получить доступ, находится внутри iframe
, и вы пытаетесь получить к нему доступ за пределами контекста iframe
, это также приведет к сбою.
Если вы хотите получить элемент в iframe, вы можете узнать, как здесь .
Вот предустановленное изображение, чтобы было проще установить пиксели вручную.
После этого шага я использую Excel, чтобы установить каждый пиксель один за другим. После этого просто наведите свой телефон на экран компьютера. Вот как это выглядит. Если вам нужен лист Excel, вы можете получить его здесь ( https://docs.google.com/spreadsheets/d/18tEhboAULaSJlTjnhdZa0hOrqkUz6WmPOZSpzpSpcUE/edit?usp=sharing ).
Теперь, когда вопрос возможности не существует, как его автоматизировать? Не зная дополнительных дополнительных образцов, сложно сказать наверняка. Однако, основываясь только на этом примере, самый простой подход - просто выровнять сетку 21x21 по вашему обрезанному QR-изображению и заполнить значения, используя порог. А затем передайте это изображение вашему QR-декодеру. QR-код имеет определенный уровень избыточности, поэтому, даже если некоторые пиксели отсутствуют, вы, скорее всего, сможете восстановить исходные данные.
Вот некоторый код на python, который может служить руководством к тому, как вы можете автоматизировать это. Несколько вещей, на которые стоит обратить внимание:
Код:
import cv2
import numpy as np
def fill3box(qr):
qr[0:7,0:7] = 1
qr[14:21,14:21] = 1
qr[14:21,0:7] = 1
qr[0,0:6]=0
qr[0:6,0]=0
qr[0:6,6]=0
qr[6,0:7]=0
qr[2:5,2:5]=0
qr[14:21,14:21] = qr[0:7,0:7]
qr[14:21,0:7] = qr[0:7,0:7]
return qr
im = cv2.imread('to_process.png')
im = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
im = cv2.resize(im,(210,210))
im = 1-((im - im.min())/(im.max()-im.min())) #normalize and adjust contrast
avg=np.average(im)
qr = np.ones((21,21))
w,h = im.shape[:2]
im_orig = im.copy()
im[im<avg]=0#binarize
im[im>avg]=1
for y in range(21):
for x in range(21):
x1,y1 = (round(x*w/21),round(y*h/21))
x2,y2 = (round(x1+10),round(y1+10))
im_box = im[y1:y2,x1:x2]
if np.average(im_box)<0.6 and qr[y,x]!=0:#0.6 need tweaking
qr[y,x]=0
qr = fill3box(qr) #clean up 3 box areas as they need to be fixed
# debug visualization
for x in range(21):
p1 = (round(x*w/21),0)
p2 = (round(x*w/21),h)
cv2.line(im_orig,p1,p2,(255),1)
for y in range(21):
p1 = (0,round(y*h/21))
p2 = (w,round(y*h/21))
cv2.line(im_orig,p1,p2,(255),1)
qr = cv2.resize(qr,(210,210),interpolation=cv2.INTER_NEAREST)
im = (im*255).astype(np.uint8)
qr= (qr*255).astype(np.uint8)
im_orig= (im_orig*255).astype(np.uint8)
cv2.imwrite('im.png',im)
cv2.imwrite('qr.png',qr)
cv2.imwrite('im_orig.png',im_orig)
Обрезанное изображение to_process.png
в коде.
Сетка наложена, чтобы показать, как работает этот метод
Пороговое изображение.
Регенерированный QR, обратите внимание, что он все еще работает, даже несмотря на наличие нескольких ошибок.
Это будет сложно.
Если вы можете декодировать этот QR с помощью считывателя (я пробовал, но не получилось), можно перекодировать его с помощью устройства записи. Но нет никакой гарантии, что писатель будет воссоздавать то же самое, так как возможны разные варианты кодирования.
Если ваша цель на самом деле - иметь возможность декодировать, вы застряли. Расшифровка «вручную» может быть возможной, но она длительная и сложная. Вы также можете рассмотреть возможность перерисовки кода вручную на идеальной сетке и передать его читателю.