Особенности в OpenCV (cvCornerEigenValsAndVecs, cvCornerHarris, cvCornerMinEigenVal) / OpenCV / Recog.ru - Распознавание образов для программистов


Особенности в OpenCV (cvCornerEigenValsAndVecs, cvCornerHarris, cvCornerMinEigenVal)

cvCornerEigenValsAndVecs

Вычисление собственных значений и собственных векторов блоков изображения для детектирования углов.
void cvCornerEigenValsAndVecs(
	const CvArr* image,
	CvArr* eigenvv,
	int blockSize,
	int aperture_size=3 
);


Параметры:
image – входное изображение;
eigenvv – изображение для хранения результатов. Оно должен быть в 6 раз шире, чем исходное изображение;
blockSize – размер соседства;
aperture_size – размер ядра в операторе Собела (подробнее смотрите cvSobel).

Для каждого пикселя функция считает соседство размером blockSize*blockSize. Вычисляется матрица ковариаций производных от соседства следующим образом:

После этого он находит собственные векторы и собственные значения матрицы и сохраняет их в конечном изображении в виде


где параметры распределены попарно,
1-ая пара – собственные значения M, не отсортированы,
2-ая пара – собственные вектора соответствующие лямбда 1,
3-ая пара – собственные вектора соответствующие лямбда 2.

cvCornerHarris
Детектор краев Харриса.
void cvCornerHarris(
	const CvArr* image,
	CvArr* harris_dst,
	int blockSize,
	int aperture_size=3,
	double k=0.04 
);

Параметры:
image – входное изображение;
harris_dst – изображение, в которое будут возвращены ответы детектора Харриса, должно быть таким же как и image;
blockSize – размер соседства;
aperture_size – размер ядра в операторе Собела (подробнее смотрите cvSobel);
k – параметр детектора Харриса.

Функция выполняет детектор Харриса для изображения. Для каждого пикселя вычисляется 2*2 градиент матрицы ковариаций M над соседством blockSize*blockSize. Затем сохраняется:

на конечное изображение. Углы на изображении могут быть найдены как локальные максимумы конечного изображения.

cvCornerMinEigenVal
Расчет минимального собственного значения градиента матрицы для обнаружения углов.
void cvCornerMinEigenVal(
	const CvArr* image,
	CvArr* eigenval,
	int blockSize,
	int aperture_size=3 
);

Параметры:
image – входное изображение;
eigenval – изображение для хранения минимальных собственных значений. Должно быть такого же размера, что и image;
blockSize – размер соседства;
aperture_size – размер ядра в операторе Собела (подробнее смотрите cvSobel).

Эта функция похожа на cvCornerEigenValsAndVecs, но рассчитывает и хранит только минимальное собственное значение производных матрицы ковариации для каждого пикселя (т.е. min (Лямбда1, Лямбда 2) с точки зрения предыдущей функции.

Ну а теперь посмотрим, что же можно сделать с описанными функциями.

IplImage *img = cvLoadImage("lena.jpg", 1);
IplImage *gray = cvCreateImage(cvSize(img->width,img->height), 8, 1);
cvCvtColor(img,gray,CV_BGR2GRAY);

IplImage *img2 = cvCreateImage(cvSize(img->width*6,img->height), IPL_DEPTH_32F, 1);
IplImage *img3 = cvCreateImage(cvSize(img->width,img->height), IPL_DEPTH_32F, 1);		

cvCornerEigenValsAndVecs(gray, img2, 50, 3);

cvShowImage("1", img2);				
cvCornerHarris(gray, img3, 2, 7);
cvShowImage("2", img3);	

cvCornerMinEigenVal(gray, img3, 10, 7);
cvShowImage("3", img3);	

cvWaitKey(0);


Т.е. здесь мы видим все 3 функции, для начала посмотрим, что выдает cvCornerEigenValsAndVecs
blockSize = 50 и aperture_size=3

На первый взгляд что-то непонятное, но сжимаем ширину в 6 раз и видим знакомую картинку


blockSize = 50 и aperture_size=7


blockSize = 5 и aperture_size=7


cvCornerHarris
blockSize = 2 и aperture_size=7


blockSize = 10 и aperture_size=7


blockSize = 10 и aperture_size=5


Ну и далее cvCornerMinEigenVal
blockSize = 2 и aperture_size=7


blockSize = 50 и aperture_size=7


blockSize = 10 и aperture_size=5


Т.е. видим нахождение особенностей на изображениях. В следующий раз рассмотрим другие особенности OpenCV.
  • 0
  • 04 июня 2012, 14:20
  • vidikon

Комментарии (0)

RSS свернуть / развернуть

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.