Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > C++ > Visual C++
Регистрация

Восстановить пароль
Повторная активизация e-mail


Донат для форума - использовать для поднятия настроения себе и модераторам

А ещё здесь можно купить рекламу за 15 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru

Ответ
 
Опции темы
Старый 18.06.2013, 17:24   #1
umbar
Новичок
 
Регистрация: 18.06.2013
Сообщений: 2
Репутация: 10
По умолчанию Сравнение двух изображений по пиксельно.

Ребят, помогите написать программу, которая будет сравнивать одно изображение с другим по точкам. Два изображения одного формата bmp.
Пользуюсь Visual C++ 2008
(Много чего искал в гугл, но толком ничего не нашел)
Заранее спасибо ^^
umbar вне форума   Ответить с цитированием
Старый 18.06.2013, 20:20   #2
Nuklon
Форумчанин
 
Аватар для Nuklon
 
Регистрация: 05.04.2012
Адрес: Россия, г. Абакан
Сообщений: 134
Репутация: 40
По умолчанию

Код:
#include <windows.h>
#include <stdio.h>
#define LoadBmp(fbmp)\
(HBITMAP)LoadImage((HINSTANCE)GetModuleHandle(NULL),\
                              fbmp, IMAGE_BITMAP, 0, 0,\
                              LR_LOADFROMFILE | LR_CREATEDIBSECTION)



// 16-цветный и монохромный растр не поддерживается
BOOL  IsBitmapEqual(HBITMAP bmp1, HBITMAP bmp2) {
        BITMAP bi1,  bi2;
        ZeroMemory(&bi1, sizeof(BITMAP));
        ZeroMemory(&bi2, sizeof(BITMAP));

        if(! GetObject(bmp1, sizeof(BITMAP), (LPVOID)&bi1))
                return FALSE;
        if(! GetObject(bmp2, sizeof(BITMAP), (LPVOID)&bi2))
                return FALSE;

	// должен быть одинаковый размер и разряд пикселей
	if((bi1.bmHeight   != bi2.bmHeight)  ||
	   (bi1.bmWidth   != bi2.bmWidth) ||
	   (bi1.bmBitsPixel != bi2.bmBitsPixel) ||
	   (bi1.bmBitsPixel < 8) ||
	   (bi2.bmBitsPixel < 8)) 
		return FALSE;
	bi1.bmBitsPixel >>= 3;

	DWORD size = (DWORD)(bi1.bmWidth * bi1.bmHeight * bi1.bmBitsPixel);
 	BYTE* ptr1 = (BYTE*) HeapAlloc(GetProcessHeap(), 0uL, size);
	if(ptr1 == NULL)
		 return FALSE;

	BYTE* ptr2 = (BYTE*) HeapAlloc(GetProcessHeap(), 0uL, size);
	if(ptr2 == NULL) {
		HeapFree(GetProcessHeap(), 0uL, (LPVOID)ptr1);
		return FALSE;
	}
	GetBitmapBits(bmp1, (LONG)size, (LPVOID)ptr1);
	GetBitmapBits(bmp2, (LONG)size, (LPVOID)ptr2);

	BOOL res = FALSE;
	if(! memcmp(ptr1, ptr2, (size_t)size))
		res = TRUE;

	HeapFree(GetProcessHeap(), 0uL, (LPVOID)ptr1);
	HeapFree(GetProcessHeap(), 0uL, (LPVOID)ptr2);
	return res;
}





int  main(void) {

	HBITMAP bmp1 = LoadBmp(TEXT("image1.bmp"));
	HBITMAP bmp2 = LoadBmp(TEXT("image2.bmp"));

	if(IsBitmapEqual(bmp1, bmp2))
		puts("Yes eual.");
	else
		puts("Not equal !");

	DeleteObject(bmp1);
	DeleteObject(bmp2);
	return 0;
}
Nuklon вне форума   Ответить с цитированием
Старый 18.06.2013, 20:21   #3
Smitt&Wesson
Профессионал
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Адрес: г. Киров
Сообщений: 13,907
Репутация: 741

skype: forwardbiznes
По умолчанию

Оператор if, не подойдёт? Это шутка.
Нам самом деле, всё гораздо сложнее. Если это одна и та-же фотогавфия, то гда всй пррсто, сравниваем пиксели и всех делов. Если фотографии одного пейзажа, но снятые с интервалов с одну секунду, тогда имет место синхронизация снимков. В этом случае используются адаптивные алгоритмы.
__________________
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума   Ответить с цитированием
Старый 18.06.2013, 22:51   #4
umbar
Новичок
 
Регистрация: 18.06.2013
Сообщений: 2
Репутация: 10
По умолчанию

Nuklon, спасибо, но можешь вкратце рассказать что ты сделал:D
Алгоритм то бишь

Последний раз редактировалось umbar; 18.06.2013 в 22:58.
umbar вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сравнение изображений. C# Serg94 Помощь студентам 1 27.11.2012 19:43
Сравнение 2 изображений wlords Помощь студентам 0 23.11.2010 21:47
Сравнение изображений AmbaQ Общие вопросы Delphi 1 07.08.2010 19:20
Delphi - сравнение изображений battlefrogg Помощь студентам 7 17.07.2010 18:58
Сравнение изображений DeDoK Общие вопросы Delphi 1 11.10.2008 21:16


13:57.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.

Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru