Exemple #1
0
 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
Exemple #2
0
    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
Exemple #3
0
 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]
Exemple #4
0
 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
Exemple #5
0
 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]
Exemple #6
0
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
Exemple #7
0
    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
Exemple #8
0
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
Exemple #10
0
 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
Exemple #12
0
 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]
Exemple #13
0
 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
Exemple #14
0
 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
Exemple #15
0
 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
Exemple #16
0
 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")
Exemple #17
0
 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')
Exemple #19
0

#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
Exemple #20
0
    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
Exemple #21
0
    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