Beispiel #1
0
def main():
    os.chdir(os.path.join(sys.argv[1], "motion"))
    try:
        os.mkdir(OUTPUT_DIR_NAME)
    except OSError:
        pass

    #os.system("del klein\\*.png")
    os.system("convert motion_*.png -adaptive-resize 500x500! " +
              OUTPUT_DIR_NAME + "\\motion_%02d.png")

    os.chdir(OUTPUT_DIR_NAME)
    os.system("convert motion_*.png -append result.png")

    img = cv.LoadImageM("result.png")
    values = []

    for y in range(img.rows):
        value = cv.Get1D(cv.GetRow(img, y), 0)[0]
        values.append(value)

    values.sort(reverse=True)

    output_img = cv.CreateImage(cv.GetSize(img), cv.IPL_DEPTH_8U, 3)
    for y in range(img.rows):
        for x in range(img.cols):
            cv.Set2D(output_img, y, x, cv.RGB(values[y], values[y], values[y]))

    cv.SaveImage("result_sorted.png", output_img)

    raw_input("- done -")
    return
Beispiel #2
0
def main():
    os.chdir(sys.argv[1])

    #print "DELETE ALL FILES FIRST!"

    #tree = et.parse("project.xml")
    #movie = tree.getroot()
    #start_frame = int( movie.attrib["start_frame"] )
    #end_frame = int( movie.attrib["end_frame"] )

    f_shots = open("shots.txt")
    shots = [
        (int(start), int(end))
        for start, end in [line.split("\t")[0:2] for line in f_shots if line]
    ]
    f_shots.close()

    f_chapters = open("chapters.txt")
    chapters = [int(line) for line in f_chapters if line]
    f_chapters.close()
    '''# fix first and add last frame
	chapters[0] = start_frame
	chapters.append(end_frame)'''

    os.chdir("shot_colors")
    try:
        os.mkdir(OUTPUT_DIR_NAME)
    except:
        pass

    filenames = glob.glob("shot_colors_*.png")

    last_shot_nr = 0
    ch = 1
    for i, shot in enumerate(shots):
        start_frame, end_frame = shot
        if ch == len(chapters):  # will this ever happen, freder?
            print("den rest noch")
            #print " ".join(filenames[last_shot_nr:])
            os.system("convert %s -append chapters/chapter_%02d.png" %
                      (" ".join(filenames[last_shot_nr:]), ch))
            break
        elif end_frame >= chapters[ch]:
            #if end_frame >= chapters[ch]:
            print("{} : {} -> {}".format(ch, last_shot_nr, i - 1))
            print(" ".join(filenames[last_shot_nr:i]))
            os.system("convert %s -append chapters/chapter_%02d.png" %
                      (" ".join(filenames[last_shot_nr:i]), ch))
            last_shot_nr = i
            ch += 1

    os.chdir(OUTPUT_DIR_NAME)

    for file_nr, file in enumerate(os.listdir(os.getcwd())):
        if os.path.isdir(file):
            continue

        img_orig = cv.LoadImageM(file)
        w, h = img_orig.cols, img_orig.rows

        img_hls = cv.CreateImage((w, h), cv.IPL_DEPTH_8U, 3)
        cv.CvtColor(img_orig, img_hls, cv.CV_BGR2HLS)

        output_img = cv.CreateImage((PIXELS_PER_COLOR * NUM_CLUSTERS, h),
                                    cv.IPL_DEPTH_8U, 3)

        # convert to numpy array
        a = numpy.asarray(cv.GetMat(img_hls))
        a = a.reshape(a.shape[0] * a.shape[1],
                      a.shape[2])  # make it 1-dimensional

        # set initial centroids
        init_cluster = []
        step = w / NUM_CLUSTERS
        #for x, y in [(0*step, h*0.1), (1*step, h*0.3), (2*step, h*0.5), (3*step, h*0.7), (4*step, h*0.9)]:
        for x, y in [(0 * step, h * 0.1), (1 * step, h * 0.1),
                     (2 * step, h * 0.3), (3 * step, h * 0.3),
                     (4 * step, h * 0.5), (5 * step, h * 0.5),
                     (6 * step, h * 0.7), (7 * step, h * 0.7),
                     (8 * step, h * 0.9), (9 * step, h * 0.9)]:
            x = int(x)
            y = int(y)
            init_cluster.append(a[y * w + x])

        centroids, labels = scipy.cluster.vq.kmeans2(a,
                                                     numpy.array(init_cluster))

        vecs, dist = scipy.cluster.vq.vq(a, centroids)  # assign codes
        counts, bins = scipy.histogram(vecs,
                                       len(centroids))  # count occurrences
        centroid_count = []
        for i, count in enumerate(counts):
            if count > 0:
                centroid_count.append((centroids[i].tolist(), count))

        centroid_count.sort(hls_sort2)

        px_count = w * h
        x = 0
        for item in centroid_count:
            count = item[1] * (PIXELS_PER_COLOR * NUM_CLUSTERS)
            count = int(math.ceil(count / float(px_count)))
            centroid = item[0]
            for l in range(count):
                if x + l >= PIXELS_PER_COLOR * NUM_CLUSTERS:
                    break
                for y in range(h):
                    cv.Set2D(output_img, y, x + l,
                             (centroid[0], centroid[1], centroid[2]))
            x += count

        output_img_rgb = cv.CreateImage(cv.GetSize(output_img),
                                        cv.IPL_DEPTH_8U, 3)
        cv.CvtColor(output_img, output_img_rgb, cv.CV_HLS2BGR)
        cv.SaveImage(file, output_img_rgb)

        # save to text-file
        if file_nr == 0:
            f_out = open(os.path.join("..", "..", "chapter_colors.txt"), "w")
            f_out.write("")  # reset
            f_out.close()

        f_out = open(os.path.join("..", "..", "chapter_colors.txt"), "a")
        row = cv.GetRow(output_img_rgb, 0)
        WIDTH = row.cols
        #print WIDTH

        data_items = []
        counter = 0
        last_px = cv.Get1D(row, 0)
        for i in range(WIDTH):
            px = cv.Get1D(row, i)
            if px == last_px:
                counter += 1
                if i == WIDTH - 1:
                    #f_out.write("%d, %d, %d, %d _ " % (int(last_px[2]), int(last_px[1]), int(last_px[0]), counter))
                    data_items.append(
                        "%d, %d, %d, %d" % (int(last_px[2]), int(
                            last_px[1]), int(last_px[0]), counter))
                continue
            else:
                #f_out.write("%d, %d, %d, %d _ " % (int(last_px[2]), int(last_px[1]), int(last_px[0]), counter))
                data_items.append("%d, %d, %d, %d" % (int(
                    last_px[2]), int(last_px[1]), int(last_px[0]), counter))
                counter = 1
                last_px = px

        print("{} colors missing".format(NUM_CLUSTERS - len(data_items)))
        for j in range(NUM_CLUSTERS -
                       len(data_items)):  # sometimes there are fewer colors
            data_items.append("0, 0, 0, 0")
        f_out.write(" _ ".join(data_items))
        f_out.write("\n")
        f_out.close()

    os.system("convert chapter_*.png -append _CHAPTERS.png")
    return
# remove row name from data
for j in range(0, numRows):
    data[j].pop(0)

# fill data matrix
samples = cv.fromarray(np.array(data, np.float32))

# set ten iterations of the k-means algorithm
criteria = (cv.CV_TERMCRIT_EPS + cv.CV_TERMCRIT_ITER, 10, 1.0)

# k-means algorithm (implementation in OpenCV)
cv.KMeans2(samples, clusters, labels, criteria)

# get the cluster info into an array
for j in range(0, numRows):
    cluster.append(int(cv.Get1D(labels, j)[0]))

# prep output file
output = open(outFile, "wb")
writer = csv.writer(output, dialect='excel-tab')

# write the first row
firstRow.insert(1, "Cluster")
writer.writerow(firstRow)

for j in range(0, numRows):
    row = rows[j]
    row.insert(1, cluster[j])
    writer.writerow(row)

# close output file
def main():
	project_root_dir = sys.argv[1]
	os.chdir(project_root_dir)
	os.chdir(os.path.join(OUTPUT_DIR_NAME, OUTPUT_DIR_NAME))
	
	output_img = cv.CreateImage((WIDTH, WIDTH), cv.IPL_DEPTH_8U, 3)
	
	print os.system("identify -format \"%k\" result.png")
	print "reducing colors to 10"
	os.system("convert result.png +dither -colors 10 result_quant.png")
	
	img_orig = cv.LoadImageM("result_quant.png")
	output_img = cv.CreateImage((WIDTH, WIDTH), cv.IPL_DEPTH_8U, 3)
	
	img_hls = cv.CreateImage(cv.GetSize(img_orig), cv.IPL_DEPTH_8U, 3)
	cv.CvtColor(img_orig, img_hls, cv.CV_BGR2HLS)
	
	pixels = numpy.asarray(cv.GetMat(img_hls))
	d = {}
	
	print "counting..."
	for line in pixels:
		for px in line:
			if tuple(px) in d:
				d[tuple(px)] += 1
			else:
				d[tuple(px)] = 1
	
	colors = d.keys()
	#print "%d pixels, %d colors" % (img_orig.width*img_orig.height, len(colors))
	
	print "sorting..."
	#colors.sort(hls_sort)
	colors = sort_by_distance(colors)
	
	px_count = img_orig.width * img_orig.height
	x_pos = 0
	
	print "building image..."
	for color in colors:
		l = d[color] / float(px_count)
		l = int(math.ceil( l*WIDTH ))
		
		for x in range(l):
			if x_pos+x >= WIDTH:
					break
			for y in range(WIDTH):
				cv.Set2D(output_img, y, x_pos+x, (int(color[0]), int(color[1]), int(color[2])))
		x_pos += l
	
	print "saving..."
	output_img_rgb = cv.CreateImage(cv.GetSize(output_img), cv.IPL_DEPTH_8U, 3)
	cv.CvtColor(output_img, output_img_rgb, cv.CV_HLS2BGR)
	cv.SaveImage("_RESULT.png", output_img_rgb)
	
	os.chdir( r"..\.." )
	f = open("colors.txt", "w")
	row = cv.GetRow(output_img_rgb, 0)
	
	counter = 0
	last_px = cv.Get1D(row, 0)
	for i in range(WIDTH):
		px = cv.Get1D(row, i)
		if px == last_px:
			counter += 1
			if i == WIDTH-1:
				f.write("%d, %d, %d, %d\n" % (int(last_px[2]), int(last_px[1]), int(last_px[0]), counter))
			continue
		else:
			f.write("%d, %d, %d, %d\n" % (int(last_px[2]), int(last_px[1]), int(last_px[0]), counter))
			counter = 1
			last_px = px
	f.close()
	
	return
def main():

    tree = utils.open_project(sys.argv)
    if tree == None:
        return

    try:
        os.mkdir(OUTPUT_DIR_NAME)
    except OSError:
        pass

    movie = tree.getroot()
    file_path = movie.attrib["path"]

    cap = cv.CreateFileCapture(file_path)
    cv.QueryFrame(cap)

    # skip frames in the beginning, if neccessary
    start_frame = int(movie.attrib["start_frame"])
    for i in range(start_frame):
        cv.QueryFrame(cap)

    f = open("shots.txt", "r")
    lines = [line for line in f if line]
    f.close()

    t = time.time()

    w = None
    h = None

    #for line in f:
    for nr, line in enumerate(lines):
        print(nr + 1), "/", len(lines)

        #frame_from, frame_to, width, scene_nr = [int(i) for i in line.split("\t")]
        #width, scene_nr = [int(i) for i in line.split("\t")][2:]
        start_frame, end_frame, width = [
            int(splt) for splt in line.split("\t")
        ]
        #width *= STRETCH_FAKTOR

        faktor = None
        output_img = None

        for frame_counter in range(width):
            #if frame_counter % STRETCH_FAKTOR == 0:
            #	img = cv.QueryFrame(cap)
            #	if not img:
            #		break

            img = cv.QueryFrame(cap)
            if not img:
                break

            if nr == 0:
                w = img.width
                h = img.height

            if frame_counter == 0:
                faktor = float(w) / float(width)
                output_img = cv.CreateImage((width, h), cv.IPL_DEPTH_8U, 3)

            col_nr = faktor * (frame_counter + 0.5)
            col_nr = int(math.floor(col_nr))
            #print frame_counter, width, col_nr, w
            col = cv.GetCol(img, col_nr)

            for i in range(h):
                cv.Set2D(output_img, i, frame_counter, cv.Get1D(col, i))

        #return

        cv.SaveImage(
            os.path.join(OUTPUT_DIR_NAME,
                         "shot_slitscan_%03d_%d.png" % (nr + 1, start_frame)),
            output_img)

    print "%.2f min" % ((time.time() - t) / 60)
    #raw_input("- done -")
    return
#Cargo la imagen (argv[1]) y le aplico el filtro de escala de grises

storage = cv.CreateMat(1, 8, cv.CV_32FC3)
#Creo la matriz en la que voy a meter los posibles circulos que sean encontrados en la imagen
#Si el numero de circulos es mayor que 8, el programa ya no funciona, deben de ser menor de 8

cv.Smooth(imagen, imagen, cv.CV_GAUSSIAN, 5, 5)
#Le aplico el filtro de Gaussian Blur y suavizo la imagen para eliminar el ruido

cv.HoughCircles(imagen, storage, cv.CV_HOUGH_GRADIENT, 1, 100)
#Aplico la funcion de "Hough Circles" para encontrar los circulos en la imagen

for n in range(0, storage.cols):
    #El "Storage.cols" contiene el numero de circulos que fueron encontrados en la imagen
    #For para diubjar los circulos que fueron encontrados en la imagen
    r = cv.Get1D(storage, n)
    #Obtengo una tupla que contiene los valores del primer circulo que sea encontrado
    c = (cv.Round(r[0]), cv.Round(r[1]))
    #"c" es una tupla de dos valores redondeados del "cv.round"
    #contiene la posicion del circulo
    cv.Circle(imagen, c, cv.Round(r[2]), cv.CV_RGB(0, 0, 0), 2)
    #Dibujo el circulo

    print r  #Imprimiendo Tupla
    print r[2]  #Imprimiendo radio de circulo

    #Con los radios encontrados, muestro que valor tiene la moneda
    if r[2] == 67.59068298339844:
        print "\nMoneda de $10 Detectada"
    if r[2] == 68.31178283691406:
        print "\nMoneda de $5 Detectada"
    def detectar(self, imagen):
        global centro

        copia = cv.CloneImage(imagen)
        # Tomamos imagen
        dimensiones = cv.GetSize(copia)
        # La transformamos a escala de grises para mayor rapidez
        grises = cv.CreateImage(dimensiones, 8, 1)
        cv.CvtColor(copia, grises,
                    cv.CV_RGB2GRAY)  # cv.CvtColor(src, dst, code)

        storage = cv.CreateMemStorage()  # video

        # Ecualizamos el histograma
        cv.EqualizeHist(grises, grises)

        #Suavizo la imagen para eliminar el ruido
        cv.Smooth(grises, grises, cv.CV_GAUSSIAN, 5, 5)

        # Cargamos el fichero cascada para ojos
        ojos = cv.Load("./haarcascade_eye_tree_eyeglasses.xml")

        # Reconocemos los objetos
        objOjo = cv.HaarDetectObjects(copia, ojos, storage, 1.1, 2, 0,
                                      (120, 120))

        #print objOjo
        mostrar = False
        if 0 < len(objOjo) < 3:
            #(x, y, ancho, alto) del area
            #que nos interesa
            area = (objOjo[0][0][0], objOjo[0][0][1], objOjo[0][0][2],
                    objOjo[0][0][3])
            for i in objOjo:
                # cortamos el area que nos interesa
                cv.SetImageROI(copia, area)

                # Una vez teniendo el area que nos interesa tenemos que
                # aplciarle filtros para que deteccion de circulos funcione bien
                image_size = cv.GetSize(copia)

                gray = cv.CreateImage(image_size, 8, 1)

                #Creo la matriz en la que voy a meter los posibles circulos
                #Si el numero de circulos es mayor que 8, el programa no funciona

                storageCir = cv.CreateMat(1, 8, cv.CV_32FC3)

                # cv.CvtColor(src, dst, code)
                cv.CvtColor(copia, gray, cv.CV_RGB2GRAY)

                # Ecualizamos el histograma
                cv.EqualizeHist(gray, gray)

                #Suavizo la imagen para eliminar el ruido
                cv.Smooth(gray, gray, cv.CV_GAUSSIAN, 5, 5)

                # buscamos circulos.... aqui nos concentraremos en buscar la iris
                #circles = cv.HoughCircles(grayImg, storage, cv.CV_HOUGH_GRADIENT, 2, 10,32,200,minRad, minRad*2)
                mostrar = True

                dp = 2
                minDist = 200.0
                param1 = 32
                param2 = 60
                minRadius = 12
                maxRadius = 24
                cv.HoughCircles(gray, storageCir, cv.CV_HOUGH_GRADIENT, dp,
                                minDist, param1, param2, minRadius, maxRadius)

                #print storageCir.cols
                #print "----"

                # recorremos los circulos encontrados
                for n in range(
                        0, storageCir.cols
                ):  # storage.cols contiene el numero de circulos encontrados

                    #Obtengo la tupla que contiene los valores del primer circulo
                    r = cv.Get1D(storageCir, n)
                    #"c" es una tupla de dos valores redondeados (cv.round)
                    #que contiene la posicion del circulo
                    c = (cv.Round(r[0]), cv.Round(r[1]))
                    #Dibujo el circulo
                    # Circle(img, center, radius, color, thickness=1, lineType=8, shift=0)
                    cv.Circle(copia, c, cv.Round(r[2]), cv.CV_RGB(255, 1, 1),
                              2)
                    cv.Circle(copia, c, 1, cv.CV_RGB(0, 255, 0), 2)

                    entrenamiento = 50  #(intentos)
                    umbral = 10
                    if self.getContador() < entrenamiento:
                        cont = self.getContador() + 1
                        self.setContador(cont)

                        centro[0] = centro[0] + c[0]
                        centro[1] = centro[1] + c[1]
                    else:
                        x = centro[0] / entrenamiento
                        y = centro[1] / entrenamiento
                        print "+++"
                        cv.Circle(copia, (x, y), 1, cv.CV_RGB(0, 0, 255), 2)
                        # metemos un filtro para no tomar lo centro parecidos pero iguales
                        diff_x = abs(x - c[0])
                        diff_y = abs(y - c[1])
                        if diff_y > umbral and diff_x > umbral:
                            # hacer algo estan muy separados
                            print "AGUAS!"
                            cv.Circle(copia, c, cv.Round(r[2]),
                                      cv.CV_RGB(255, 255, 255), 2)

                mostrar = True

        return copia, mostrar