Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

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

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

Купить рекламу на форуме - 42 тыс руб за месяц

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

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

Код:
#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,964
По умолчанию

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

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

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


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сравнение изображений. C# Serg94 Помощь студентам 1 27.11.2012 19:43
Сравнение 2 изображений wlords Помощь студентам 0 23.11.2010 20: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