2016-05-09 2 views
0

Итак, я написал код, и я хочу сравнить два набора. Однако длина возвращает только 0 или 1, в зависимости от того, использую ли я два изображения или одно и то же изображение. Это связано с тем, что мои наборы формируются как только 1 набор элементов вместо смешивания чисел друг от друга. Например, наборы, считанные как [(a, b, c)] вместо [('a', 'b', 'c')].Почему мои наборы не содержат более одного элемента? - python 2.7

Вот мой код

import cv2 
import numpy as np 
import time 
N=0 
colour=[] 
colourfile=open('Green from RGB.txt', 'r') 
for line in colourfile.readlines(): 
    colour.append([line]) 
colour_set=sorted(set(map(tuple, colour))) 



def OneNumber(im): #Converts the pixels rgb to a single number. 
    temp_im=im.astype('int32') 
    r,g,b = temp_im[:,:,0], temp_im[:,:,1], temp_im[:,:,2] 
    combo=r*1000000+g*1000+b 
    return combo 



while True: 
    cam = cv2.VideoCapture(0) 
    start=time.time() 
    while(cam.isOpened()):     #Opens camera 
     ret, im = cam.read()    #Takes screenshot 
     #im=cv2.imread('filename.type') 
     im=cv2.resize(im,(325,240))   #Resize to make it faster 
     im= im.reshape(1,-1,3) 
     im=OneNumber(im)    #Converts the pixels rgb to a singe number 
     im_list=im.tolist()     #Makes it into a list 
     im_set=set(im_list[0])    #Makes set 
     ColourCount= set(colour_set) & set(colour_set) #or set(im_set) for using/ comparing camera 
     print len(ColourCount) 

Также текстовый файл я открытие записывается как:

126255104, 8192000, 249255254, 131078, 84181000, 213254156, 

В одной, большой большой линии.

Итак, как я могу разделить числа на разные элементы в наборах, im_set и colour_set?

Благодаря

+1

Это трудно понять. Создайте [MCVE] (http://stackoverflow.com/help/mcve). – timgeb

ответ

0

У вас есть несколько ошибок в коде. Похоже, вы читаете все цвета в одну строку. Вам нужно разбить строку вместо этого, если вы хотите, набор цветов:

for line in colourfile.readlines(): 
    temp_line = [x.strip() for x in line.split(',')] ## create a temporary list, splitting on commas, and removing extra whitesapce 
    colour.extend(temp_line) ## don't put brackets around `line`, you add another "layer" of lists to the list 
    ## also don't `append` a list with a list, use `extend()` instead 
#colour_set=sorted(set(map(tuple, colour))) ## I think you're trying to convert a string to a 3-tuple of rgb color values. This is not how to do that 

У вас есть серьезные проблемы с вашим RgB цветовых представлений: что 131078? Это (13, 10, 78) или (131, 0, 78) или (1, 31, 78)? Вам нужно изменить, как эти строки цвета записываются в файл, потому что ваш формат неоднозначен. Для того, чтобы держать его просто, почему бы не записать его в файл, например так:

13 10 78 
255 255 0 

Если вы настаиваете на кодировании RGB троек в виде одной строки, то вы ИМЕЮТ на нулевой площадке все значения:

## for example 
my_rgb = (13,10,78) 
my_rgb_string = "%03d%03d%03d" % (r, g, b) ## zero-pad to exactly 3 digit width 
print(my_rgb_string) 
>> 013010078 

Еще одна проблема: вы пересекающиеся набор с собой, вместо того, пересекающей два различных набора:

ColourCount= set(colour_set) & set(colour_set) #or set(im_set) for using/ comparing camera 

должно быть что-то вроде:

ColourCount= set(colour_set) | im_set #or set(im_set) for using/ comparing camera 

Если вы хотите создать объединение всех разных цветов на изображении.

Если у вас все еще есть проблемы после устранения этих проблем, я бы порекомендовал вам опубликовать новый вопрос с обновленным кодом.

 Смежные вопросы

  • Нет связанных вопросов^_^