visual studio 2013 — аффинное преобразование в переполнении стека

В настоящее время я делаю проект для школы по обработке изображений в Visual Studio 2013, используя Open CV 3.1. Моя цель (на данный момент) — преобразовать изображение, используя аффинное преобразование, чтобы трапецеидальная доска была преобразована в прямоугольник.

Для этого я вычел определенные каналы и установил порог изображения, чтобы теперь у меня было двоичное изображение с белыми блоками по углам доски.
Теперь мне нужно выбрать 4 белых точки, которые находятся ближе всего к каждому углу, и (используя аффинное преобразование) установить их как углы преобразованного изображения.

И поскольку я впервые использую Open CV, я застрял.

Вот мой код:

#include <iostream>
#include <opencv2\core.hpp>
#include <opencv2\highgui.hpp>
#include<opencv2/imgproc.hpp>
#include <stdlib.h>
#include <stdio.h>
#include <vector>int main(){

double dist;
cv::Mat image;
image = cv::imread("C:\\Users\\...\\ideal.png");

cv::Mat imagebin;
imagebin = cv::imread("C:\\Users\\...\\ideal.png");

cv::Mat imageerode;

//cv::imshow("Test", image);

cv::Mat src = cv::imread("C:\\Users\\...\\ideal.png");
std::vector<cv::Mat>img_rgb;
cv::split(src, img_rgb);

//cv::imshow("ideal.png", img_rgb[2] - img_rgb[1]);

cv::threshold(img_rgb[2] - 0.5*img_rgb[1], imagebin , 20, 255, CV_THRESH_BINARY);
cv::erode(imagebin, imageerode, cv::Mat(), cv::Point(1, 1), 2, 1, 1);
cv::erode(imageerode, imageerode, cv::Mat(), cv::Point(1, 1), 2, 1, 1);

//  cv::Point2f array[4];
//  std::vector<cv::Point2f> array;

for (int i = 0; i < imageerode.cols; i++)
{
for (int j = 0; j < imageerode.rows; j++)
{
if (imageerode.at<uchar>(i,j) > 0)
{
dist = std::min(dist, i + j);
}
}
}

//cv::imshow("Test binary", imagebin);
cv::namedWindow("Test", CV_WINDOW_NORMAL);
cv::imshow("Test", imageerode);
cv::waitKey(0);

std::cout << "Hello world!";
return 0;
}

Как вы можете видеть, я не знаю, как перебрать каждый белый пиксель с помощью image.at и сохранить расстояние до каждого угла.

Буду признателен за помощь.

Кроме того: я не хочу просто делать это. Я действительно хочу научиться делать это. Но у меня сейчас немного ума.

Спасибо

РЕДАКТИРОВАТЬ:

Я думаю, что я закончил с поиском координат 4 точек. Но я не могу понять идею синтаксиса warpAffine.

Код:

for (int i = 0; i < imageerode.cols; i++)
{
for (int j = 0; j < imageerode.rows; j++)
{
if (imageerode.at<uchar>(i, j) > 0)
{

if (i + j < distances[0])
{
distances[0] = i + j;
coordinates[0] = i;
coordinates[1] = j;
}

if (i + imageerode.cols-j < distances[1])
{
distances[1] = i + imageerode.cols-j;
coordinates[2] = i;
coordinates[3] = j;
}

if (imageerode.rows-i + j < distances[2])
{
distances[2] = imageerode.rows - i + j;
coordinates[4] = i;
coordinates[5] = j;
}

if (imageerode.rows-i + imageerode.cols-j < distances[3])
{
distances[3] = imageerode.rows - i + imageerode.cols - j;
coordinates[6] = i;
coordinates[7] = j;
}

}
}

Где я установил все значения расстояний в imageerode.cols + imageerode.rows, так как это максимальное значение, которое он может получить.
Также: обратите внимание, что я использую геометрия такси. Мне сказали, что это быстрее, и результаты практически одинаковы.

Если бы кто-нибудь мог помочь мне с warpAffine, это было бы здорово. Я не понимаю, куда мне поместить найденные координаты.

Спасибо

0

Решение

Я не уверен, как выглядит ваша «трапециевидная доска», но если она имеет перспективное преобразование, например, когда вы снимаете прямоугольник с помощью камеры, тогда аффинного преобразования недостаточно. Используйте перспективное преобразование. Я думаю Особенности 2D + Гомография для поиска известного объекта очень близко к тому, что вы хотите сделать.

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector