Russian Qt Forum
Апрель 25, 2024, 11:24 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как скопировать часть изображения по пикселям?  (Прочитано 5284 раз)
0v.v0
Гость
« : Май 01, 2016, 17:54 »

Пытаюсь скопировать часть скриншота экрана в отдельное изображение, чтобы затем при запуске его считывать и распознавать присутствие этого элемента на экране. Но почему-то пиксели отличаются, это видно программой-пипеткой, поэтому не получается сравнивать картинки в цикле по каждой точке. Проверял не на скриншоте, а на изображении в файле - от измениться сам по себе не может Улыбающийся

В чём подвох?
Записан
Bepec
Гость
« Ответ #1 : Май 01, 2016, 18:11 »

А куда вы сохраняете? В какой формат.
Записан
0v.v0
Гость
« Ответ #2 : Май 01, 2016, 18:43 »

Код:
bool GetIcon(const QString &name1, const QString &name2)
{
    QImage im1 = QImage(name1+".jpg");
    QImage im2 = QImage(20, 35, im1.format());
    for(int x=0; x<20; x++)
        for(int y=0; y<35; y++)
            im2.setPixel(x,y, im1.pixel(x,y));

    im2.save(name2+".jpg");


    for(int x=0; x<im1.width(); x++)
        for(int y=0; y<im1.height(); y++)
            if(im1.pixel(x,y) == im2.pixel(1,1)) {
                //qDebug() << name1;
                for(int x1=x, x2=1; x2<im2.width(); x1++, x2++)
                    for(int y1=y, y2=1; y2<im2.height(); y1++, y2++)
                        if(im1.pixel(x1,y1) != im2.pixel(x2,y2))
                            return false;
                return true;
            }
    return false;
}

bool test1(const QString &name1, const QString &name2)
{
    QImage im1 = QImage(name1+".jpg");//.convertToFormat(QImage::Format_RGB888);
    QImage im2 = QImage(name2+".jpg");//.convertToFormat(QImage::Format_RGB888);

    for(int x=0; x<im1.width(); x++)
        for(int y=0; y<im1.height(); y++)
            if(im1.pixel(x,y) == im2.pixel(1,1)) {
                //qDebug() << name1;
                for(int x1=x, x2=1; x2<im2.width(); x1++, x2++)
                    for(int y1=y, y2=1; y2<im2.height(); y1++, y2++)
                        if(im1.pixel(x1,y1) != im2.pixel(x2,y2))
                            return false;
                return true;
            }
    return false;
}

int main(int argc, char** argv)
{
    qDebug() << GetIcon("1", "11");
    qDebug() << test1("1", "11");
}
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #3 : Май 04, 2016, 11:12 »

глянь в инструментах Qt: %QTDIR%/tools/pixeltool
готовый бинарь лежит в каталоге %QTDIR%/bin
(справедливо для Qt 4.x, Винда)
Записан

Юра.
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Май 04, 2016, 11:31 »

В чём подвох?
В формате "jpg" который "жмет с потерями", т.е. сохраняет не 1:1. Возьмите "png". Также для выкопировки куска удобнее QImage::copy, а если все-таки нужно в циклах по пикселям, то дорогостоящих QImage::pixel/setPixel стараются избегать
Записан
Smogg
Гость
« Ответ #5 : Май 06, 2016, 03:39 »

О, а вот этот вопрос я никак не решу((

Как на картинке найти подкартинку? При условии, что пиксель-точного соответствия нету.

Ладно, если есть лишь одно искуемое изображение, можно занятся попиксельным сравнением, а потом отсекать по порогу. И в принципе работало, но с заметной задержкой. Но мне то хочется на большом изображении искать тысячи подкартинок, за интерфейсно-адекватное время.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.11 секунд. Запросов: 23.