<< | #255 ; La sangoplena batalo por 3D-fotilo kontinuu |
>> |
Ni en la civito Mueleja Insulo havas ambician celon. Jen unu malgranda paso direkte al nia propra programo por la 3D-fotilo de nia sankta nacio. Eĉ la alta Papo de Vatikano en Romo ne havas pli bonan.
Mi volus trovi korelativaj, akordiĝaj anguloj en du fotoj de stereoskopa bildparo. Mi nome volus fine desegni la bonajn parojn de anguloj en la sama foto. Tial mi uzas foton en kiu mi havas la ambaŭ originaj fotoj de 3D-fotilo kune, iom malgrandigitaj.
Estas ja facile por foti per multaj Mpx, multaj milionoj da rastrunuoj en unu foto, sed certe estas tro probleme por prezenti tiaj grandegaj fotoj flanko ĉe flanko en la origina grando kaj vidi ilin samtempe. Ni bezonas pli malgrandaj fotoj. Teorio eble estas interesa. Praktikaj aferoj tamen estas la plej gravaj.
import cv2 import numpy as np from matplotlib import pyplot as plt # Eksperimento kun paro da fotoj kune en unu datumo # ------------------------------ # Ni komencas el paro da fotoj, maldekstra kaj dekstra foto, # ĉar ni fine volas desegni linioj sur la paro da fotoj filename = '/home/pi/Kuvat/paro800.jpg' img = cv2.imread(filename)
En praktiko kredeble estas grave kiaj estas la disiga kapablo de fotiloj kaj la grando de celo en la fotoj. Mi bezonas iom da praktikaj spertoj por trovi uzeblan kazon. Certe mi ne volas uzi tre grandan disigan kapablon en la fotoj. La finaj rezultoj por la 3D-fotilo tamen devus esti uzeblaj kaj iom bonaj.
# Metodo por legi partan ortangulon de kolora foto # lu : la maldekstra supra punkto de ortangula parto # rd : la dekstra suba punkto de ortangula parto def fnPartaFoto (grandaFoto, lu, rd): partaFoto = grandaFoto[lu[1]:rd[1], lu[0]:rd[0]] return partaFoto # Metodo por trovi anguloj en "nigra kaj blanka" foto, gray # La metodo desegnas ortanguloj por la kolora foto def fnMarkuAnguloj (koloroj, gray): dst = cv2.cornerHarris(gray, 2, 3, 0.04) dst = cv2.dilate(dst, None) ret, dst = cv2.threshold(dst, 0.01*dst.max(), 255, 0) dst = np.uint8(dst) ret, labels, stats, centroids = cv2.connectedComponentsWithStats(dst) centroids = np.uint8(centroids) # Sekve ni desegnas por la kolora foto for i in range(centroids.shape[0]): koloroj = cv2.rectangle(koloroj, (centroids[i,0]-2, centroids[i,1]-2), (centroids[i,0]+2, centroids[i,1]+2), (0,0,0), 1) # Nigra ortangulo koloroj[centroids[i,1], centroids[i,0]] = (255,255,255) # Blanka centra punkto return centroids # grando de partaj fotoj adX = 390 adY = 290 # randaj punktoj por la maldekstra foto lpu = (5, 3) # maldekstra supra angulo lpd = (lpu[0]+adX, lpu[1]+adY) # dekstra suba angulo print ( lpu, lpd ) # (5, 3) (395, 293) # randaj punktoj por la dekstra foto rpu = (405, 3) # maldekstra supra angulo rpd = (rpu[0]+adX, rpu[1]+adY) # dekstra suba angulo print ( rpu, rpd ) # (405, 3) (795, 293) # Koloroj en alia ordo: RGB koloroj (por Matplotlib) por la BGR foto b,g,r = cv2.split(img) img = cv2.merge((r,g,b)) # Ni desegnu la du selektitajn partojn de foto per grandaj koloraj ortanguloj img = cv2.rectangle(img, (lpu[0]-1, lpu[1]-1), (lpd[0]+1, lpd[1]+1), (0,255,0), 1) img = cv2.rectangle(img, (rpu[0]-1, rpu[1]-1), (rpd[0]+1, rpd[1]+1), (255,0,255), 1) plt.title('Paro de fotoj en unu foto') plt.imshow(img, cmap='gray', interpolation = 'bicubic') plt.show()
Jen nia bildparo en Matplotlib kun RGB-koloroj. Sekve ni disigos la du fotoj el la bildparo. Ni trovos anguloj aparte en la du fotoj, maldekstra foto kaj dekstra foto. Ni uzos nur la grizajn "nigra kaj blanka" -fotoj por trovi anguloj, sed ni desegnos la ortangulojn por la koloraj fotoj.
kolorojL = fnPartaFoto (img, lpu, lpd) grayL = cv2.cvtColor(kolorojL, cv2.COLOR_BGR2GRAY) print ( 'L', grayL.shape ) # L (290, 390) grayL = np.float32(grayL) centroidsL = fnMarkuAnguloj (kolorojL, grayL) kolorojR = fnPartaFoto (img, rpu, rpd) grayR = cv2.cvtColor(kolorojR, cv2.COLOR_BGR2GRAY) print ( 'R', grayR.shape ) # R (290, 390) grayR = np.float32(grayR) centroidsR = fnMarkuAnguloj (kolorojR, grayR) plt.subplot(121), plt.imshow(kolorojL,'gray'), plt.title('Foto maldekstra') plt.subplot(122), plt.imshow(kolorojR,'gray'), plt.title('Foto dekstra') plt.show()
Iom da problemoj en la provizora rezulto. Ĉi tiu ja ankoraŭ ne estas nia preta 3D-fotilo. Ni devas pli multe lerni kaj progresi. La trovitaj angulaj punktoj eble ne estas la plej interesaj. Se oni volus kalkuli la distancon de terglobo en la fotoj el tiuj anguloj, oni havus gravaj malfacilaĵoj. La fotoj ne havas multaj komunaj angulaj ortanguloj en la plej interesa celo, la terglobo. Eblas uzi nur komunaj anguloj en la du fotoj.
Nu, fakte estus praktike neeble por kalkuli la distancon de terglobo kun ĉi tiuj fotaj anguloj el ĉi tiuj fotoj, ĉar en la maldekstra foto tute ne estas bonaj anguloj trovitaj en la terglobo. Do tute ne eblas por trianguligi la distancon de terglobo.
La komputilo ekzemple certe ne komprenas ke la distanco de terglobo estas proksimume la sama kiel - aŭ eĉ iom malpli ol - la distanco de tego de fenestro. La komputilo ne scias ke la fenestra tego ne estas travidebla kaj ke la terglobo do devus esti pli proksima ol la tego je fenestro.
Se ni direktigus la ambaŭ fotiloj rekte al la terglobo kaj se la distanco estus pli malgranda, ni eble ricevus pli bonaj rezultoj, pli multe da bonaj anguloj trovitaj en la terglobo. Aŭ eble mi povus unue aŭtomate tranĉi la neutilajn (en la maldekstra foto) tro maldekstrajn kaj (en la dekstra foto) tro dekstrajn partojn for el la du fotoj de 3D-fotilo, tial ke la programo nur sin koncentru en la plej utila komuna centra parto kaj sekve trovu pli multe da utilaj komunaj angulaj centraj punktoj en la fotoj.
La kazo ne estu tro komplika por trakti per la programo. Kredeble mi devas provizore serĉi por la plej facila kazo por trovi sufiĉe bonaj rezultoj. La metodo estas iom sentema por eraroj.
... sed la laboro kontinuas ...
Kaj certe fine ..........
NI VENKOS!
La Ambasadoro en Pori de sendependa nacio Mueleja Insulo |