введите описание изображения здесь Я уже разместил этот вопрос, но на этот раз я попытаюсь быть более точным c.
Я могу обнаружить квадрат с оригиналом Метод opencv:
#include "opencv2/core.hpp"
#include "opencv2/imgproc.hpp"
#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui.hpp"
#include <iostream>
using namespace cv;
using namespace std;
int thresh = 50, N = 11;
const char* wndname = "Square Detection Demo";
static double angle( Point pt1, Point pt2, Point pt0 )
{
double dx1 = pt1.x - pt0.x;
double dy1 = pt1.y - pt0.y;
double dx2 = pt2.x - pt0.x;
double dy2 = pt2.y - pt0.y;
return (dx1*dx2 + dy1*dy2)/sqrt((dx1*dx1 + dy1*dy1)*(dx2*dx2 + dy2*dy2) + 1e-10);
}
static void findSquares( const Mat& image, vector<vector<Point> >& squares )
{
squares.clear();
Mat pyr, timg, gray0(image.size(), CV_8U), gray;
pyrDown(image, pyr, Size(image.cols/2, image.rows/2));
pyrUp(pyr, timg, image.size());
vector<vector<Point> > contours;
for( int c = 0; c < 3; c++ )
{
int ch[] = {c, 0};
mixChannels(&timg, 1, &gray0, 1, ch, 1);
for( int l = 0; l < N; l++ )
{
if( l == 0 )
{
Canny(gray0, gray, 0, thresh, 5);
dilate(gray, gray, Mat(), Point(-1,-1));
}
else
{
gray = gray0 >= (l+1)*255/N;
}
findContours(gray, contours, RETR_LIST, CHAIN_APPROX_SIMPLE);
vector<Point> approx;
for( size_t i = 0; i < contours.size(); i++ )
{
approxPolyDP(contours[i], approx, arcLength(contours[i], true)*0.02, true);
if( approx.size() == 4 &&
fabs(contourArea(approx)) > 1000 &&
isContourConvex(approx) )
{
double maxCosine = 0;
for( int j = 2; j < 5; j++ )
{
double cosine = fabs(angle(approx[j%4], approx[j-2], approx[j-1]));
maxCosine = MAX(maxCosine, cosine);
}
if( maxCosine < 0.0595) // 0.0595
squares.push_back(approx);
}
}
}
}
}
static void drawSquares( Mat& image, const vector<vector<Point> >& squares )
{
for( size_t i = 0; i < squares.size(); i++ )
{
const Point* p = &squares[i][0];
int n = (int)squares[i].size();
polylines(image, &p, &n, 1, true, Scalar(0,255,0), 3, LINE_AA);
}
imshow(wndname, image);
}
int main(void)
{
static const char* names[] = { /*"C:\\Users\\hugoo\\Documents\\Prog\\NexterMU\\Qt\\OpenCV\\DetectionShapeProgram\\square_01.jpg ",
"C:\\Users\\hugoo\\Documents\\Prog\\NexterMU\\Qt\\OpenCV\\DetectionShapeProgram\\square_02.png ",*/
"C:\\Users\\hugoo\\Documents\\Prog\\NexterMU\\Qt\\OpenCV\\DetectionShapeProgram\\IMG_0480.jpg ",
0 };
vector<vector<Point> > squares;
for( int i = 0; names[i] != 0; i++ )
{
string filename = samples::findFile(names[i]);
Mat image = imread(filename, IMREAD_COLOR);
if( image.empty() )
{
cout << "Couldn't load " << filename << endl;
continue;
}
findSquares(image, squares);
drawSquares(image, squares);
int c = waitKey();
if( c == 27 )
break;
}
return 0;
}
Но теперь я хочу перефразировать заданный квадрат, обнаруженный этой программой, и переосмыслить / флатенировать его с уже существующей моделью (квадратом).
Причина, по которой я хочу это сделать, заключается в том, что когда пользователь собирается сделать фотографию квадрата, он может быть не прямо над квадратом, а, возможно, чуть-чуть справа / слева от него.
В моем имейте в виду, что это своего рода «перемещение» камеры прямо над квадратом. Поэтому все фигуры, которые мне нужно проанализировать внутри данного квадрата, не будут искажены.
В соответствии с этим, возможно, некоторые из вас уже делали подобные вещи раньше. Я надеюсь, что вы сможете дать мне инструменты, которые мне нужны для этого. Заранее благодарю вас за это.
Я уверен, что есть некоторые функции opencv, которые могут помочь. Я просто еще не знаю их. Я буду продолжать искать.
Я не могу сказать больше о том, почему я делаю это, но если у вас есть какие-либо вопросы, которые могут помочь вам помочь мне, я весь слух. Я как бы застрял сейчас;).
Еще раз спасибо.
Входное изображение: 1 Справочное изображение: 2