Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
laba1_1_Shleev_Bliznuk.docx
Скачиваний:
21
Добавлен:
26.03.2016
Размер:
947.3 Кб
Скачать

Результаты:

Рис. 10-11. Преобразование Хау, для нахождения прямых.

Фрагмент кода выполнения

//========================================================================================

cv::namedWindow("Detected Lines", CV_WINDOW_AUTOSIZE);

src = cv::imread("kniga.png", 1); // загружаем изображение

if (!src.data) return -1; // проверка

cv::Mat cdst;

Canny(src, dst, 50, 200, 3);

cvtColor(dst, cdst, CV_GRAY2BGR);

#if 0

vector<Vec2f> lines;

HoughLines(dst, lines, 1, CV_PI / 180, 100, 0, 0);

for (size_t i = 0; i < lines.size(); i++)

{

float rho = lines[i][0], theta = lines[i][1];

Point pt1, pt2;

double a = cos(theta), b = sin(theta);

double x0 = a*rho, y0 = b*rho;

pt1.x = cvRound(x0 + 1000 * (-b));

pt1.y = cvRound(y0 + 1000 * (a));

pt2.x = cvRound(x0 - 1000 * (-b));

pt2.y = cvRound(y0 - 1000 * (a));

line(cdst, pt1, pt2, Scalar(0, 0, 255), 3, CV_AA);

}

#else

std::vector<cv::Vec4i> lines;

HoughLinesP(dst, lines, 1, CV_PI / 180, 50, 50, 10);

for (size_t i = 0; i < lines.size(); i++)

{

cv::Vec4i l = lines[i];

line(cdst, cv::Point(l[0], l[1]), cv::Point(l[2], l[3]), cv::Scalar(0, 0, 255), 3, CV_AA);

}

#endif

imshow("Detected Lines", cdst);

cv::waitKey();

cvDestroyWindow("Detected Lines");

// ==========================================================

Задание 6: По найденным прямым постройте аффинное преобразование и выровняйте изображение.

Преобразование плоскости (изображения) называется аффинным, если оно взаимно однозначно и образом любой прямой является прямая.

Взаимно однозначное преобразование, переводит каждую точку плоскости(изображения) I в другую точку плоскости(изображения) I', таким образом, что каждой точке I соответствует какая-то точка I'.

Примеры аффинных преобразований:

* обычное движение — фактически движение является параллельным переносом;

* повороты;

* растяжения или сжатия относительно прямой.

Для осуществления аффинных преобразований, обычно используется матрица перехода.

ВOpenCV аффинные преобразования осуществляются функциейcvWarpAffine():

CVAPI(void) cvWarpAffine( const CvArr* src, CvArr* dst, const CvMat* map_matrix,

int flags CV_DEFAULT(CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS),

CvScalar fillval CV_DEFAULT(cvScalarAll(0)) ) — применение аффинной трансформации

src — исходное изображение

dst — целевое изображение

map_matrix — матрица трансформации 2х3

flags — комбинация флагов метода интерполяции и флагов:

#define CV_WARP_FILL_OUTLIERS 8

#define CV_WARP_INVERSE_MAP 16

CV_WARP_FILL_OUTLIERS — заполнить все пиксели целевого изображения (если пиксели отсутствуют на исходном изображени используются fillval)

CV_WARP_INVERSE_MAP — используется обратная трансформация из dst в src

fillval — значение для заполнения пикселей вне исходного изображения dst(x',y') =src(x;y).

Важным параметром функции cvWarpAffine() является map_matrix — матрица трансформации.

Сгенерировать эту матрицу можно с помощью двух методов —cvGetAffineTransform() илиcv2DRotationMatrix():

CVAPI(CvMat*)cvGetAffineTransform(constCvPoint2D32f*src,constCvPoint2D32f*dst,CvMat*map_matrix);— рассчёт матрицы аффинной трансформации из трёх пар точек.

src — 3 координаты исходного изображения;

dst — 3 соотносящихся координаты целевого изображения;

map_matrix — получаемая матрица трансформации 2х3.

CVAPI(CvMat*) cv2DRotationMatrix( CvPoint2D32f center, double angle,

doublescale,CvMat*map_matrix);— рассчитывает аффинную матрицу 2D-вращения;

center — центр вращения на исходном изображении;

angle — угол поворота в гардусах (положительная величина означает вращение против часовой стрелки);

scale — масштаб;

map_matrix — указатель на получаемую матрицу 2х3.

a       b       (1 - a)*center.x - b*center.y

b-1     a       center.x - (1 - a)*center.y, где a = scale - cos(angle), b = scale - sin(angle)

Рис. 12. Результат аффинного преобразования.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]