์ฐ๋ฆฌ๋๋ผ์์ ๋งค๋ ๋ฐ์ํ๋ ๊ตํต์ฌ๊ณ ๋ ๋ฌด๋ ค 20๋ง ๊ฑด. ์ง๊ธ ์ด ์๊ฐ์๋ ๊ณ ์๋๋ก์์๋ ์ ์ ์์ด ์ฌ๊ณ ๊ฐ ์ผ์ด๋๊ณ ์๋ค. ๊ณ ์๋๋ก์์ ํ๋ฒ ์ฌ๊ณ ๊ฐ ๋ฐ์ํ๋ฉด ์ฌ๊ณ ๊ฐ ๋ฌ์ ๋ ๋ณดํํ์ฌ์ ์ฐจ๋์ด ์ถ๋ํ๊ธฐ ์ ๊น์ง๋ ๊ณผ์ค ๋น์จ์ ๋ฐ๋ก ์ฐ์ ํ ์ ์๋ค๋ ๋ฌธ์ ๋ ์๋ค. ๊ทธ ์ ๊น์ง ๊ตํต์ด ์ ์ฒด๋๋ ํผ๋์ด ๋น์ด์ง๋ ๊ฒ์ด๋ค. ๋ง์ฝ ๋ณดํํ์ฌ๊ฐ ์ถ๋ํ๋๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ธ 5~10๋ถ๋ณด๋ค ๋น ๋ฅด๊ฒ ์คํ๋ผ์ธ์์ ๊ฐ๋จํ๊ฒ ๊ณผ์ค์ ํ์ธํ ์ ์๋ค๋ฉด, ์ด๋ก ์ธํ ํผํด๊ฐ ์ค์ด๋ค ๊ฒ์ด๋ผ ์๊ฐํ๊ณ ๋ฐ๋ผ์ OpenCV๋ฅผ ์ด์ฉํด ๋ธ๋๋ฐ์ค์ ์์์ ๋ถ์ํด๋ณด๊ธฐ๋ก ํ์๋ค.
์์ ๋ถ์์ ํ๊ธฐ ์ํด ์์์ ํ๋ ์ ๋จ์๋ก ๋ถ๋ฆฌํ์ฌ ์ ์ฅํ์๋ค
def frame(filename, portal): #(ํ์ผ ๊ฒฝ๋ก, ์ ์ฅ ๊ฒฝ๋ก)
vid=cv2.VideoCapture(filename) #๋น๋์ค ๋ณด๊ธฐ
count=0
while True:
yes, image=vid.read() #์์์ ์ฌ์ง ๋จ์๋ก ๋ฐ์์ค๊ธฐ
if not yes: #์์์ด ๋๋๋ฉด
break
count+=1
cv2.imwrite(portal+'/'+str(count)+'.png',image) #์ง์ ๋ ๊ฒฝ๋ก์ ์ ์ฅ
if count==200:
breakCanny edge ์๊ณ ๋ฆฌ์ฆ์ ์ด์ฉํด ์ฐจ์ ์ ๊ฒ์ถํ์๋ค

def doit(inf,newmap,frcount,ROI_range):
chaseon=[]
for i in range(1,frcount+1):
start_time=time.time()
image = cv2.imread(newmap+"/"+str(i)+'.png') # ์ด๋ฏธ์ง ์ฝ๊ธฐ
height, width = image.shape[:2] # ์ด๋ฏธ์ง ๋์ด, ๋๋น
gray_img = grayscale(image) # ํ๋ฐฑ์ด๋ฏธ์ง๋ก ๋ณํ
blur_img = gaussian_blur(gray_img, 3) # Blur ํจ๊ณผ
canny_img = canny(blur_img, 50, 160) # Canny edge ์๊ณ ๋ฆฌ์ฆ
vertices = np.array([ROI_range], dtype=np.int32)
ROI_img = region_of_interest(canny_img, vertices)
line_arr = hough_lines(ROI_img, 1, 1 * np.pi/180, 30, 10, 20) # ํํ ๋ณํ #[x1, y1, x2, y2]
line_arr = np.squeeze(line_arr)
# ๊ธฐ์ธ๊ธฐ ๊ตฌํ๊ธฐ
slope_degree = (np.arctan2(line_arr[:,1] - line_arr[:,3], line_arr[:,0] - line_arr[:,2]) * 180) / np.pi
# ์ํ ๊ธฐ์ธ๊ธฐ ์ ํ
line_arr = line_arr[np.abs(slope_degree)<160]
slope_degree = slope_degree[np.abs(slope_degree)<160]
# ์์ง ๊ธฐ์ธ๊ธฐ ์ ํ
line_arr = line_arr[np.abs(slope_degree)>95]
slope_degree = slope_degree[np.abs(slope_degree)>95]
# ํํฐ๋ง๋ ์ง์ ๋ฒ๋ฆฌ๊ธฐ
L_lines, R_lines = line_arr[(slope_degree>0),:], line_arr[(slope_degree<0),:]
L_lines, R_lines = L_lines[:,None], R_lines[:,None]
for j in L_lines:
for k in j:
for l in k:
l=int(l)
for j in R_lines:
for k in j:
for l in k:
l=int(l)
temp1=[list(j) for j in L_lines]+[list(j) for j in R_lines]
rrealtemp=[]
temp2=[]
for j in temp1:
for k in j:
for l in k:
rrealtemp.append(int(l))
temp2.append(rrealtemp)
rrealtemp=[]
chaseon.append(temp2)
if i==1 or inf[0]//10*10%i==0:
k=(frcount-i)*(time.time()-start_time)/(i)
print(k,"์ด ์ ๋ ๋จ์์ต๋๋ค")
return chaseon #3์ฐจ์ฐจ๋ ์ ๋ฐฉ์ RGB ํ๊ท ๊ฐ์ด ๊ธ๊ฒฉํ๊ฒ ๋ณํ๋ ์์ ์ด ์ฌ๊ณ ์์ ์ด๋ผ ํ๋จํ์๋ค. ์ ๋ฐฉ์ ์ฐจ์ ์ ์ ํ๋ ์ฌ๋ค๋ฆฌ๊ผด ์์ญ์ ๋ง๋ค๊ณ , ๊ทธ ์์ญ ๋ด์ RGB ํ๊ท ๊ฐ์ ๊ณ์ฐํ์๋ค.

def hoit(search_range,newmap,av,inf):
left_count=0
right_count=0
start=av[1] #์ฒ์ ๋ด ์์ ์
for i in range(1,inf[0]+1):
av=SAM_572(search_range,newmap,av,i)
if sub(av[i][0][0],start[0][0])+sub(av[i][0][1],start[0][1])+sub(av[i][0][2],start[0][2])>=40: #BGR ๊ฐ์ ๋ณํ
left_count+=1
if sub(av[i][1][0],start[1][0])+sub(av[i][1][1],start[1][1])+sub(av[i][1][2],start[1][2])>=40: #BGR๊ฐ์ ๋ณํ
right_count+=1
if sub(av[i][0][0],start[0][0])+sub(av[i][0][1],start[0][1])+sub(av[i][0][2],start[0][2])<40 and left_count!=0:
left_count=0
if sub(av[i][1][0],start[1][0])+sub(av[i][1][1],start[1][1])+sub(av[i][1][2],start[1][2])<40 and right_count!=0:
right_count=0
if left_count==5:
return ('left',i)
if right_count==5:
return ('right',i)
return ('no',0)def analcoc(chaseon):
count=0
for j in chaseon:
for i in j:
if i==[]:
continue
a=gradient(i)
if abs(a)>math.tan(1.48): #์ฐจ์ ์ ๊ธฐ์ธ๊ธฐ๊ฐ 85๋๋ฅผ ๋์ด๊ฐ๋ฉด
count+=1
if count==5: #5ํ๋ ์ ์ด์ ์ง์๋๋ฉด
return 'yes'
return 'no' #์ฐจ์ ๋ณ๊ฒฝ์ด ์์๋คdef judge(information,cs,direc): #cs(๋ด ์ฐจ๋),direc(์๋๋ฐฉ ์ฐจ๋)=left or right or no
if 'ํฉ๋ฅ๋๋ก๋ฅผ ํตํด ํฉ๋ฅ ์ค' in information[2]:
return information+[501,70,30]
if 'ํฉ๋ฅ๋์ด ์ฌ๋ผ์ง๋ ๋๋ก ์ฃผํ์ค' in information[2]:
return information+[502,60,40]
if direc=='no' and '๊ฐ๊ธธ ์ฃผํ' in information[3]: #๋ท์ฐจ์ ์์ฐจ์ ์ฐจ์ ์ด ๊ฐ์๊ณ ๊ฐ๊ธธ์ ์ฃผํํ ๊ฒฝ์ฐ
return information+[506,0,100]
elif direc=='no':
return information+[507,0,100]
if cs=='no' and direc=='right':
return information+[503,80,20]
if cs=='no' and direc=='left':
return information+[504,70,30]์ฌ์ฉ์์๊ฒ ๊ฒฐ๊ณผ๋ฅผ ๊ธ๊ณผ ๊ทธ๋ํ๋ก ์๊ฐํํ์ฌ ๋ณด์ฌ์ค๋ค

def show(information): #information=[์์_๊ฒฝ๋ก, ์์ฐจ์ธ์ง_๋ท์ฐจ์ธ์ง, ์์ฐจ_ํน์ง, ๋ท์ฐจ_ํน์ง, ์์ฐจ_์ถ๊ฐ_๊ณผ์ค, ๋ท์ฐจ_์ถ๊ฐ_๊ณผ์ค, ์ฌ๊ฑด์ ํ๋ฒํธ, ์์ฐจ_๊ณผ์ค๋น์จ, ๋ท์ฐจ_๊ณผ์ค๋น์จ]
front_fault=information[4]+information[7] #์
๋ ฅ๋ฐ์ ์, ๋ท์ฐจ์ ํน์ง์ ๋ฐํ์ผ๋ก ์ต์ข
๊ณผ์ค ๋น์จ ๊ณ์ฐ
rear_fault=information[5]+information[8]
if front_fault>=100:
front_fault=100
rear_fault=0
elif rear_fault>=100:
rear_fault=100
front_fault=0- ์ ํ์ HyunSeo Jung, @BSS / hsjung02@Github
- ์ ์ Sang Jung, @BSS / withsang@Github
