Skip to content

withSang/Blackbox-Video-Analyzing-System

ย 
ย 

Repository files navigation

๋ธ”๋ž™๋ฐ•์Šค ์˜์ƒ ๋ถ„์„์„ ํ†ตํ•œ ๊ณ ์†๋„๋กœ ์‚ฌ๊ณ  ๊ณผ์‹ค ๋ถ„์„

1. ์—ฐ๊ตฌ๋™๊ธฐ

์šฐ๋ฆฌ๋‚˜๋ผ์—์„œ ๋งค๋…„ ๋ฐœ์ƒํ•˜๋Š” ๊ตํ†ต์‚ฌ๊ณ ๋Š” ๋ฌด๋ ค 20๋งŒ ๊ฑด. ์ง€๊ธˆ ์ด ์‹œ๊ฐ„์—๋„ ๊ณ ์†๋„๋กœ์—์„œ๋Š” ์…€ ์ˆ˜ ์—†์ด ์‚ฌ๊ณ ๊ฐ€ ์ผ์–ด๋‚˜๊ณ  ์žˆ๋‹ค. ๊ณ ์†๋„๋กœ์—์„œ ํ•œ๋ฒˆ ์‚ฌ๊ณ ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์‚ฌ๊ณ ๊ฐ€ ๋‚ฌ์„ ๋•Œ ๋ณดํ—˜ํšŒ์‚ฌ์˜ ์ฐจ๋Ÿ‰์ด ์ถœ๋™ํ•˜๊ธฐ ์ „๊นŒ์ง€๋Š” ๊ณผ์‹ค ๋น„์œจ์„ ๋ฐ”๋กœ ์‚ฐ์ •ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๋ฌธ์ œ๋„ ์žˆ๋‹ค. ๊ทธ ์ „๊นŒ์ง€ ๊ตํ†ต์ด ์ •์ฒด๋˜๋Š” ํ˜ผ๋ž€์ด ๋นš์–ด์ง€๋Š” ๊ฒƒ์ด๋‹ค. ๋งŒ์•ฝ ๋ณดํ—˜ํšŒ์‚ฌ๊ฐ€ ์ถœ๋™ํ•˜๋Š”๋ฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์ธ 5~10๋ถ„๋ณด๋‹ค ๋น ๋ฅด๊ฒŒ ์˜คํ”„๋ผ์ธ์—์„œ ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ณผ์‹ค์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด, ์ด๋กœ ์ธํ•œ ํ”ผํ•ด๊ฐ€ ์ค„์–ด๋“ค ๊ฒƒ์ด๋ผ ์ƒ๊ฐํ–ˆ๊ณ  ๋”ฐ๋ผ์„œ OpenCV๋ฅผ ์ด์šฉํ•ด ๋ธ”๋ž™๋ฐ•์Šค์˜ ์˜์ƒ์„ ๋ถ„์„ํ•ด๋ณด๊ธฐ๋กœ ํ•˜์˜€๋‹ค.

2. ํ๋ฆ„๋„

ํ๋ฆ„๋„

3. ์ฃผ์š” ์ฝ”๋“œ

3.1 ์˜์ƒ์„ ํ”„๋ ˆ์ž„ ๋‹จ์œ„๋กœ ๋ถ„๋ฆฌ

์˜์ƒ ๋ถ„์„์„ ํ•˜๊ธฐ ์œ„ํ•ด ์˜์ƒ์„ ํ”„๋ ˆ์ž„ ๋‹จ์œ„๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ์ €์žฅํ•˜์˜€๋‹ค

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:
           break

3.2 ์ฐจ์„  ๊ฒ€์ถœ

Canny 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์ฐจ

3.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)

3.4 ์ฐจ์„  ๋ณ€๊ฒฝ ์—ฌ๋ถ€ ๊ฒ€์ถœ

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'  #์ฐจ์„  ๋ณ€๊ฒฝ์ด ์—†์—ˆ๋‹ค

3.5 ๊ณผ์‹ค๋น„์œจ ๊ฒฐ์ •

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]

3.6 ์‹œ๊ฐํ™”

์‚ฌ์šฉ์ž์—๊ฒŒ ๊ฒฐ๊ณผ๋ฅผ ๊ธ€๊ณผ ๊ทธ๋ž˜ํ”„๋กœ ์‹œ๊ฐํ™”ํ•˜์—ฌ ๋ณด์—ฌ์ค€๋‹ค ํŒ์—… ๊ทธ๋ž˜ํ”„

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

4. Member

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages

  • Python 100.0%