def ordInvFHWTForNumItersGivenNumFwdIters(signal, num_fwd_iters, num_inv_iters): print("num_fwd_iters = %d" % num_fwd_iters) print("num_inv_iters = %d" % num_inv_iters) sig_len = len(signal) if sig_len < 2 or not NumUtils.isPowOf2(sig_len): raise Exception('sig_len < 2 or not isPowOf2') num_avail_iters = NumUtils.intLog2(sig_len) if num_inv_iters > num_fwd_iters: raise Exception('ordInvFHWTForNumItersGivenNumFwdIters: num_inv_iters > num_fwd_iters') a0, a1 = 0, 0 restored_vals = None gap = int(math.pow(2, num_avail_iters - num_fwd_iters)) print "num_avail_iters", str(num_avail_iters) print "num_fwd_iters", str(num_fwd_iters) print "gap", str(gap) j = 0 for scale in xrange(1, num_inv_iters+1): restored_vals = [] restored_vals = [0 for i in xrange(2*gap)] for i in xrange(gap): a0 = signal[i] + signal[gap+i] a1 = signal[i] - signal[gap+i] restored_vals[2*i] = a0 restored_vals[2*i+1] = a1 for i in xrange(2*gap): signal[i] = restored_vals[i] gap *= 2
def ordFHWT(signal): sig_len = len(signal) if not NumUtils.isPowOf2(sig_len): raise Exception('sig_len is not PowOf2') num_sweeps = NumUtils.intLog2(sig_len) if num_sweeps == 1: acoeff = (signal[0] + signal[1]) / 2.0 ccoeff = (signal[0] - signal[1]) / 2.0 signal[0] = acoeff signal[1] = ccoeff return acoeffs = [] ## step coeffs ccoeffs = [] ## wavelet coeffs for sweep_num in xrange(1, num_sweeps): size = int(math.pow(2, num_sweeps - sweep_num)) acoeffs = [0.0 for i in xrange(size)] ccoeffs = [0.0 for i in xrange(size)] ai = 0 ci = 0 end = int(math.pow(2, num_sweeps - sweep_num + 1)) - 1 for i in xrange(0, end + 1, 2): acoeffs[ai] = (signal[i] + signal[i + 1]) / 2.0 ccoeffs[ci] = (signal[i] - signal[i + 1]) / 2.0 ai += 1 ci += 1 for i in xrange(0, size): signal[i] = acoeffs[i] signal[i + size] = ccoeffs[i] acoeff = (signal[0] + signal[1]) / 2.0 ccoeff = (signal[0] - signal[1]) / 2.0 signal[0] = acoeff signal[1] = ccoeff
def ordFHWTForNumIters(signal, num_iters): sig_len = len(signal) if not NumUtils.isPowOf2(sig_len): return num_sweeps = NumUtils.intLog2(sig_len) if num_iters > num_sweeps: raise Exception('ordFHWTForNumIters: num_iters > num_sweeps') acoeff = 0 ccoeff = 0 if num_sweeps == 1: acoeff = (signal[0] + signal[1])/2.0 ccoeff = (signal[0] - signal[1])/2.0 signal[0] = acoeff signal[1] = ccoeff return acoeffs = [] ccoeffs = [] for sweep_num in xrange(1, num_iters+1): size = int(math.pow(2, num_sweeps - sweep_num)) acoeffs = [0.0 for i in xrange(size)] ccoeffs = [0.0 for i in xrange(size)] ai = 0 ci = 0 end = int(math.pow(2.0, num_sweeps - sweep_num + 1)) - 1 for i in xrange(0, end+1, 2): acoeffs[ai] = (signal[i] + signal[i+1])/2.0 ccoeffs[ci] = (signal[i] - signal[i+1])/2.0 ai += 1 ci += 1 for i in xrange(size): signal[i] = acoeffs[i] signal[i + size] = ccoeffs[i]
def ordInvFHWTForNumItersGivenNumFwdIters(signal, num_fwd_iters, num_inv_iters): print("num_fwd_iters = %d" % num_fwd_iters) print("num_inv_iters = %d" % num_inv_iters) sig_len = len(signal) if sig_len < 2 or not NumUtils.isPowOf2(sig_len): raise Exception('sig_len < 2 or not isPowOf2') num_avail_iters = NumUtils.intLog2(sig_len) if num_inv_iters > num_fwd_iters: raise Exception('ordInvFHWTForNumItersGivenNumFwdIters: num_inv_iters > num_fwd_iters') a0, a1 = 0, 0 restored_vals = None gap = int(math.pow(2, num_avail_iters - num_fwd_iters)) print "num_avail_iters", str(num_avail_iters) print "num_fwd_iters", str(num_fwd_iters) print "gap", str(gap) j = 0 for scale in xrange(1, num_inv_iters + 1): restored_vals = [] restored_vals = [0 for i in xrange(2 * gap)] for i in xrange(gap): a0 = signal[i] + signal[gap + i] a1 = signal[i] - signal[gap + i] restored_vals[2 * i] = a0 restored_vals[2 * i + 1] = a1 for i in xrange(2 * gap): signal[i] = restored_vals[i] gap *= 2
def ordFHWTForNumIters(signal, num_iters): sig_len = len(signal) if not NumUtils.isPowOf2(sig_len): return num_sweeps = NumUtils.intLog2(sig_len) if num_iters > num_sweeps: raise Exception('ordFHWTForNumIters: num_iters > num_sweeps') acoeff = 0 ccoeff = 0 if num_sweeps == 1: acoeff = (signal[0] + signal[1]) / 2.0 ccoeff = (signal[0] - signal[1]) / 2.0 signal[0] = acoeff signal[1] = ccoeff return acoeffs = [] ccoeffs = [] for sweep_num in xrange(1, num_iters + 1): size = int(math.pow(2, num_sweeps - sweep_num)) acoeffs = [0.0 for i in xrange(size)] ccoeffs = [0.0 for i in xrange(size)] ai = 0 ci = 0 end = int(math.pow(2.0, num_sweeps - sweep_num + 1)) - 1 for i in xrange(0, end + 1, 2): acoeffs[ai] = (signal[i] + signal[i + 1]) / 2.0 ccoeffs[ci] = (signal[i] - signal[i + 1]) / 2.0 ai += 1 ci += 1 for i in xrange(size): signal[i] = acoeffs[i] signal[i + size] = ccoeffs[i]
def process_image(image): image2 = image[:] image = OneDHWTLaneDetectorV2.crop_image(image) thresh = OneDHWTLaneDetectorV2.pre_process(image) ll_points = OneDHWTLaneDetectorV2.get_ll_spike_positions(thresh, signal_row_start=Params.ROI_HEIGHT - 1, signal_row_end=0, signal_col_start=0, signal_col_end=64, row_thresh=40) rl_points = OneDHWTLaneDetectorV2.get_rl_spike_positions(thresh, signal_row_start=Params.ROI_HEIGHT - 1, signal_row_end=0, signal_col_start=(Params.ROI_WIDTH - 64), signal_col_end=Params.ROI_WIDTH, row_thresh=40) ll_points, rl_points = OneDHWTLaneDetectorV2.filter_cross_points(ll_points, rl_points) updated_ll_points = [tuple((a + Params.ROI_START_COL, b + Params.ROI_START_ROW)) for a, b in ll_points] updated_rl_points = [tuple((a + Params.ROI_START_COL, b + Params.ROI_START_ROW)) for a, b in rl_points] NumUtils.draw_lanes(image2, updated_ll_points, -60, -30, color=(0, 255, 0), thickness=2) NumUtils.draw_lanes(image2, updated_rl_points, 30, 60, color=(0, 0, 255), thickness=2) cv2.rectangle(image2, (Params.ROI_START_COL, Params.ROI_START_ROW), (Params.ROI_END_COL, Params.ROI_END_ROW), (255, 255, 0)) return image2
def ordFHWT(signal): sig_len = len(signal) if not NumUtils.isPowOf2(sig_len): raise Exception('sig_len is not PowOf2') num_sweeps = NumUtils.intLog2(sig_len) if num_sweeps == 1: acoeff = (signal[0] + signal[1]) / 2.0 ccoeff = (signal[0] - signal[1]) / 2.0 signal[0] = acoeff signal[1] = ccoeff return acoeffs = [] ccoeffs = [] for sweep_num in xrange(1, num_sweeps): size = int(math.pow(2, num_sweeps - sweep_num)) ## print("size = %d" % size) acoeffs = [0.0 for i in xrange(size)] ccoeffs = [0.0 for i in xrange(size)] ai = 0 ci = 0 end = int(math.pow(2, num_sweeps - sweep_num + 1)) - 1 for i in xrange(0, end + 1, 2): acoeffs[ai] = (signal[i] + signal[i + 1]) / 2.0 ccoeffs[ci] = (signal[i] - signal[i + 1]) / 2.0 ai += 1 ci += 1 for i in xrange(0, size): signal[i] = acoeffs[i] signal[i + size] = ccoeffs[i] acoeff = (signal[0] + signal[1]) / 2.0 ccoeff = (signal[0] - signal[1]) / 2.0 signal[0] = acoeff signal[1] = ccoeff
def run(image_path, output_path): image = cv2.imread(image_path) image2 = image[:] image = OneDHWTLaneDetectorV2.crop_image(image) thresh = OneDHWTLaneDetectorV2.pre_process(image) row_thresh = int(image.shape[1]/2) ll_points = OneDHWTLaneDetectorV2.get_ll_spike_positions(thresh, signal_row_start=Params.ROI_HEIGHT - 1, signal_row_end=0, signal_col_start=0, signal_col_end=64, dbg=debug, row_thresh=row_thresh, image=image2) rl_points = OneDHWTLaneDetectorV2.get_rl_spike_positions(thresh, signal_row_start=Params.ROI_HEIGHT - 1, signal_row_end=0, signal_col_start=(Params.ROI_WIDTH - 64), signal_col_end=Params.ROI_WIDTH, dbg=debug, row_thresh=row_thresh, image=image2) ll_points, rl_points = OneDHWTLaneDetectorV2.filter_cross_points(ll_points, rl_points) # filtered_ll_points = OneDHWTLaneDetectorV2.filter_lines(ll_points, -60, -30, dbg=debug) # filtered_rl_points = OneDHWTLaneDetectorV2.filter_lines(rl_points, 30, 60, dbg=debug) updated_ll_points = [tuple((a + Params.ROI_START_COL, b + Params.ROI_START_ROW)) for a, b in ll_points] updated_rl_points = [tuple((a + Params.ROI_START_COL, b + Params.ROI_START_ROW)) for a, b in rl_points] if debug: print("Filtered ll points: " + str(ll_points)) print("Filtered rl points: " + str(rl_points)) print("Updated ll points: " + str(updated_ll_points)) print("Updated rl points: " + str(updated_rl_points)) # NumUtils.draw_line(image2, updated_ll_points, (0, 255, 0)) # NumUtils.draw_line(image2, updated_rl_points, (0, 0, 255)) # NumUtils.draw_line(image2, filtered_ll_points, (0, 255, 0)) # NumUtils.draw_line(image2, filtered_rl_points, (0, 0, 255)) # NumUtils.draw_lanes(image, ll_points, -60, -30, color=(0, 255, 0), thickness=2) # NumUtils.draw_lanes(image, rl_points, 30, 60, color=(0, 0, 255), thickness=2) # NumUtils.draw_lanes(image2, updated_ll_points, -60, -30, color=(0, 255, 0), thickness=2) # NumUtils.draw_lanes(image2, updated_rl_points, 30, 60, color=(0, 0, 255), thickness=2) NumUtils.fit_lanes(image2, updated_ll_points, -60, -30, color=(0, 255, 0), thickness=2) NumUtils.fit_lanes(image2, updated_rl_points, 30, 60, color=(0, 0, 255), thickness=2) cv2.rectangle(image2, (Params.ROI_START_COL, Params.ROI_START_ROW), (Params.ROI_END_COL, Params.ROI_END_ROW), (255, 255, 0)) cv2.imwrite(output_path, image2) del image2 del image del thresh del ll_points del rl_points
def testOrdInvFHWT(signal): n = NumUtils.intLog2(len(signal)) orig_signal = copy.deepcopy(signal) print('n = %d' % n) print('signal: %s' % str(signal)) OneDHWT.ordFHWT(signal) print('OneDHWT: %s' % str(signal)) OneDHWT.ordInvFHWT(signal) print('OneInvDHWT: %s' % str(signal)) rslt = NumUtils.areEqualLists(signal, orig_signal) print('signal equality: %s' % str(rslt)) return rslt
def ordInvFHWT(signal): sig_len = len(signal) if sig_len < 2 or not NumUtils.isPowOf2(sig_len): raise Exception('sig_len < 2 or not isPowOf2') num_iters = NumUtils.intLog2(sig_len) a0 = 0 a1 = 0 restored_vals = None gap = 0 for scale in xrange(1, num_iters + 1): gap = int(math.pow(2, scale - 1)) restored_vals = [] restored_vals = [0.0 for i in xrange(2 * gap)] for i in xrange(gap): a0 = signal[i] + signal[gap + i] a1 = signal[i] - signal[gap + i] restored_vals[2 * i] = a0 restored_vals[2 * i + 1] = a1 for i in xrange(2 * gap): signal[i] = restored_vals[i]
def testOrdInvFHWTForNumItersGivenNumFwdIters(signal, num_fwd_iters, num_inv_iters): if num_inv_iters > num_fwd_iters: raise Exception('num_inv_iters > num_fwd_iters') num_avail_iters = NumUtils.intLog2(len(signal)) if num_inv_iters > num_avail_iters: raise Exception('num_inv_iters > num_avail_iters') orig_signal = copy.deepcopy(signal) sig_copy = copy.deepcopy(signal) print('num_fwd_iters = %d' % num_fwd_iters) print('num_inv_iters = %d' % num_inv_iters) OneDHWT.ordFHWTForNumIters(signal, num_fwd_iters) OneDHWT.ordFHWTForNumIters(sig_copy, num_fwd_iters - num_inv_iters) OneDHWT.ordInvFHWTForNumItersGivenNumFwdIters(signal, num_fwd_iters, num_inv_iters) rslt = NumUtils.areEqualLists(signal, sig_copy) print(signal) print(sig_copy) print('signal equality: %s' % str(rslt)) return rslt
def ordInvFHWT(signal): sig_len = len(signal) if sig_len < 2 or not NumUtils.isPowOf2(sig_len): raise Exception('sig_len < 2 or not isPowOf2') num_iters = NumUtils.intLog2(sig_len) a0 = 0 a1 = 0 restored_vals = None gap = 0 for scale in xrange(1, num_iters+1): gap = int(math.pow(2, scale-1)) restored_vals = [] restored_vals = [0.0 for i in xrange(2*gap)] for i in xrange(gap): a0 = signal[i] + signal[gap+i] a1 = signal[i] - signal[gap+i] restored_vals[2*i] = a0 restored_vals[2*i + 1] = a1 for i in xrange(2*gap): signal[i] = restored_vals[i]
def ordInvFHWTForNumIters(signal, num_iters): sig_len = len(signal) if sig_len < 2 or not NumUtils.isPowOf2(sig_len): return num_avail_iters = NumUtils.intLog2(sig_len) if num_iters > num_avail_iters: return a0, a1 = 0, 0 restored_vals = None gap = 1 j = 0 for scale in xrange(1, num_iters + 1): restored_vals = [] restored_vals = [0 for i in xrange(2 * gap)] for i in xrange(gap): a0 = signal[i] + signal[gap + i] a1 = signal[i] - signal[gap + i] restored_vals[2 * i] = a0 restored_vals[2 * i + 1] = a1 for i in xrange(2 * gap): signal[i] = restored_vals[i] gap *= 2
def filter_lines(points, angle_low_thresh, angle_high_thresh, dbg=False): filtered_lines = [] for i in xrange(0, len(points), 2): for j in xrange(i+1, len(points), 2): if dbg: print("OneDHWTLaneDetectorV2.filter_points:" + str(i) + "\t" + str(j)) angle = NumUtils.get_angle(points[i], points[j]) if angle_low_thresh <= angle <= angle_high_thresh: filtered_lines.append((points[i], points[j])) if dbg: print("OneDHWTLaneDetectorV2.filter_points:\n" + str(points[i]) + "\t" + str(points[j]) + "\tAngle: " + str(angle) + "\t" + str(angle_low_thresh <= angle <= angle_high_thresh)) return filtered_lines
def ordInvFHWTForNumIters(signal, num_iters): sig_len = len(signal) if sig_len < 2 or not NumUtils.isPowOf2(sig_len): return num_avail_iters = NumUtils.intLog2(sig_len) if num_iters > num_avail_iters: return a0, a1 = 0, 0 restored_vals = None gap = 1 j = 0 for scale in xrange(1, num_iters+1): restored_vals = [] restored_vals = [0 for i in xrange(2*gap)] for i in xrange(gap): a0 = signal[i] + signal[gap+i] a1 = signal[i] - signal[gap+i] restored_vals[2*i] = a0 restored_vals[2*i+1] = a1 for i in xrange(2*gap): signal[i] = restored_vals[i] gap *= 2
def testOrdFHWTForNumIters(signal): n = NumUtils.intLog2(len(signal)) print("n = %d" % n) copy_signal = copy.deepcopy(signal) for i in xrange(1, n): print("num iters %d" % i) print("Original: %s" % str(signal)) OneDHWT.ordFHWTForNumIters(signal, i) print("Transformed: %s" % str(signal)) OneDHWT.orderedInvFHWTForNumIters(signal, i) print("Reversed: %s" % str(signal)) for j in xrange(len(signal)): if signal[j] != copy_signal[j]: print("FALSE") return print("TRUE")
def filter_lines(points, angle_low_thresh, angle_high_thresh, dbg=False): filtered_lines = [] for i in xrange(0, len(points), 2): for j in xrange(i + 1, len(points), 2): if dbg: print("OneDHWTLaneDetectorV2.filter_points:" + str(i) + "\t" + str(j)) angle = NumUtils.get_angle(points[i], points[j]) if angle_low_thresh <= angle <= angle_high_thresh: filtered_lines.append((points[i], points[j])) if dbg: print("OneDHWTLaneDetectorV2.filter_points:\n" + str(points[i]) + "\t" + str(points[j]) + "\tAngle: " + str(angle) + "\t" + str(angle_low_thresh <= angle <= angle_high_thresh)) return filtered_lines
def testOrdFHWTForNumIters(signal): n = NumUtils.intLog2(len(signal)) print('n = %d' % n) copy_signal = copy.deepcopy(signal) for i in xrange(1, n): print('num iters %d' % i) print('Original: %s' % str(signal)) OneDHWT.ordFHWTForNumIters(signal, i) print('Transformed: %s' % str(signal)) OneDHWT.orderedInvFHWTForNumIters(signal, i) print('Reversed: %s' % str(signal)) for j in xrange(len(signal)): if signal[j] != copy_signal[j]: print('FALSE') return print('TRUE')
#OneDHWTTests.ex_1_15_p10() #OneDHWTTests.ex_1_3_2_4_p11() #OneDHWTTests.ex_1_12_p19() #OneDHWTTests.ex_1_16_p20() #OneDHWTTests.ex_1_19_p21() #OneDHWTTests.testOrdFHWTForNumIters([1, 7]) #OneDHWTTests.testOrdInvFHWT([8, 6, 7, 3, 1, 1, 2, 4]) #for i in xrange(20): # rslt = OneDHWTTests.testOrdInvFHWT(NumUtils.genListOfRandomInts(0, 200, 128)) # if rslt == False: # break OneDHWTTests.testOrdInvFHWTForNumItersGivenNumFwdIters( [1, 2, 3, 4, 5, 6, 7, 8], 3, 1) OneDHWTTests.testOrdInvFHWTForNumItersGivenNumFwdIters( [1, 2, 3, 4, 5, 6, 7, 8], 3, 2) OneDHWTTests.testOrdInvFHWTForNumItersGivenNumFwdIters( [1, 2, 3, 4, 5, 6, 7, 8], 3, 3) for i in xrange(20): for num_fwd_iters in xrange(1, 6): signal = NumUtils.genListOfRandomInts(0, 200, 32) for num_inv_iters in xrange(1, num_fwd_iters + 1): rslt = OneDHWTTests.testOrdInvFHWTForNumItersGivenNumFwdIters( signal, num_fwd_iters, num_inv_iters) if rslt == False: break
def get_ll_spike_positions(thresh, num_of_iterations=2, signal_row_start=235, signal_row_end=120, signal_col_start=0, signal_col_end=64, row_thresh=150, dbg=False, image=None): if dbg: print( " ########################## LEFT LANE ########################## " ) spike_positions = [] no_spike_rows_count = 0 for signal_row_number in xrange(signal_row_start, signal_row_end, -2): row = NumUtils.getImageRow(thresh, signal_row_number) ud_spikes = OneDHWTLaneDetectorV2.get_up_down_spikes( row, signal_col_start, signal_col_end, num_of_iterations, signal_row_number) # If no spikes gets detected the scan line rotated by 1 pixel, # the last (64th) pixel is the average of 62nd and 63rd pixels if len(ud_spikes) == 0: temp_row = row[1:] temp_row.append((temp_row[-1] + temp_row[-2]) / 2) ud_spikes = OneDHWTLaneDetectorV2.get_up_down_spikes( temp_row, signal_col_start, signal_col_end, num_of_iterations, signal_row_number) # If there are no spikes detected, incrementing the counter if len(ud_spikes) == 0: no_spike_rows_count += 1 # If no spikes gets detected for consecutive 5 rows, then # scan line will be shifted by 7 pixels and tries to detect spikes if len(ud_spikes) == 0 and no_spike_rows_count >= 5: temp_signal_col_start = signal_col_start temp_signal_col_end = signal_col_end # The shifting continues until it reaches row_thresh while temp_signal_col_end < row_thresh: temp_signal_col_start += 7 temp_signal_col_end += 7 row = NumUtils.getImageRow(thresh, signal_row_number) ud_spikes = OneDHWTLaneDetectorV2.get_up_down_spikes( row, temp_signal_col_start, temp_signal_col_end, num_of_iterations, signal_row_number) if len(ud_spikes) > 0: signal_col_start = temp_signal_col_start signal_col_end = temp_signal_col_end # drawing buffer lines if dbg: cv2.line(image, (temp_signal_col_start, signal_row_number), (temp_signal_col_end, signal_row_number), (255, 0, 0), 1) if len(ud_spikes) > 0: no_spike_rows_count = 0 if dbg: print("LL: detected spikes: " + str(len(ud_spikes))) for spike in ud_spikes: print spike # Needs improvement spike_position = ( OneDHWTLaneDetectorV2.optimum_spike_x(ud_spikes), signal_row_number) if dbg: print("LL: Spike position: " + str(spike_position)) ''' spike_position = ((ud_spikes[0].getSigStartOfUpRun() + ud_spikes[0].getSigLenOfUpRun() / 2), signal_row_number) ''' # setting previous spike position as mid point as the scan line delta = spike_position[0] - (signal_col_start + signal_col_end) / 2 if delta > 0: signal_col_start += delta signal_col_end += delta spike_positions.append(spike_position) # drawing the scan lines if dbg: cv2.line(image, (signal_col_start, signal_row_number), (signal_col_end, signal_row_number), (255, 255, 255), 1) print("LL: " + str(signal_row_number) + " , " + str(len(ud_spikes))) NumUtils.draw_spikes(image, ud_spikes, signal_row_number) return spike_positions
def get_ll_spike_positions(thresh, num_of_iterations=2, signal_row_start=235, signal_row_end=120, signal_col_start=0, signal_col_end=64, row_thresh=150, dbg=False, image=None): if dbg: print(" ########################## LEFT LANE ########################## ") spike_positions = [] no_spike_rows_count = 0 for signal_row_number in xrange(signal_row_start, signal_row_end, -2): row = NumUtils.getImageRow(thresh, signal_row_number) ud_spikes = OneDHWTLaneDetectorV2.get_up_down_spikes(row, signal_col_start, signal_col_end, num_of_iterations, signal_row_number) # If no spikes gets detected the scan line rotated by 1 pixel, # the last (64th) pixel is the average of 62nd and 63rd pixels if len(ud_spikes) == 0: temp_row = row[1:] temp_row.append((temp_row[-1] + temp_row[-2])/2) ud_spikes = OneDHWTLaneDetectorV2.get_up_down_spikes(temp_row, signal_col_start, signal_col_end, num_of_iterations, signal_row_number) # If there are no spikes detected, incrementing the counter if len(ud_spikes) == 0: no_spike_rows_count += 1 # If no spikes gets detected for consecutive 5 rows, then # scan line will be shifted by 7 pixels and tries to detect spikes if len(ud_spikes) == 0 and no_spike_rows_count >= 5: temp_signal_col_start = signal_col_start temp_signal_col_end = signal_col_end # The shifting continues until it reaches row_thresh while temp_signal_col_end < row_thresh: temp_signal_col_start += 7 temp_signal_col_end += 7 row = NumUtils.getImageRow(thresh, signal_row_number) ud_spikes = OneDHWTLaneDetectorV2.get_up_down_spikes(row, temp_signal_col_start, temp_signal_col_end, num_of_iterations, signal_row_number) if len(ud_spikes) > 0: signal_col_start = temp_signal_col_start signal_col_end = temp_signal_col_end # drawing buffer lines if dbg: cv2.line(image, (temp_signal_col_start, signal_row_number), (temp_signal_col_end, signal_row_number), (255, 0, 0), 1) if len(ud_spikes) > 0: no_spike_rows_count = 0 if dbg: print("LL: detected spikes: " + str(len(ud_spikes))) for spike in ud_spikes: print spike # Needs improvement spike_position = (OneDHWTLaneDetectorV2.optimum_spike_x(ud_spikes), signal_row_number) if dbg: print("LL: Spike position: " + str(spike_position)) ''' spike_position = ((ud_spikes[0].getSigStartOfUpRun() + ud_spikes[0].getSigLenOfUpRun() / 2), signal_row_number) ''' # setting previous spike position as mid point as the scan line delta = spike_position[0] - (signal_col_start + signal_col_end) / 2 if delta > 0: signal_col_start += delta signal_col_end += delta spike_positions.append(spike_position) # drawing the scan lines if dbg: cv2.line(image, (signal_col_start, signal_row_number), (signal_col_end, signal_row_number), (255, 255, 255), 1) print("LL: " + str(signal_row_number) + " , " + str(len(ud_spikes))) NumUtils.draw_spikes(image, ud_spikes, signal_row_number) return spike_positions