Witam, mam następujący problem: próbuje odfiltrować wektor współrzędnych wierzchołków figury płaskiej odczytanej z jpg. Przykładowo do trójkąt otrzymałem 9 punktów z czego 3 są faktycznymi wierzchołkami a pozostałe 6 to szum. Do rozwiązania zadanie jest mi jedynie potrzebna liczba wierzchołków( ich współrzędne są mi nie potrzebne). Jak się pozbyć zbędych punktów.
Przykładowy wektor punktów jaki otrzymuje:
[ 468, 62;
468, 63;
468,64;
360, 495;
361,495;
361,496;
575, 507;
576, 507;
575, 508]
Na podstawie tych wektorów chciałbym otrzymać informacje zwrotną że punktów jest 3(w tym przypadku).
Pozdrawiam
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <vector>
using namespace cv;
using namespace std;
Mat OurImage,grayframe,binaryframe;
void cornerHarris_demo( int, void* );
int main()
{
string Destination = "D:\\...\\NoveltyDetectionData\\Set1\\TRAINING_DATA\\007.jpg";
OurImage = imread(Destination, CV_LOAD_IMAGE_COLOR);
if(! OurImage.data)
{
printf("No image!");
getchar();
return -1;
}
cvtColor(OurImage,grayframe,CV_RGB2GRAY);
threshold(grayframe, binaryframe, 150, 255,0);
namedWindow("WINDOW", CV_WINDOW_AUTOSIZE);
imshow("WINDOW",binaryframe);
cornerHarris_demo( 0, 0 );
waitKey(0);
}
void cornerHarris_demo( int, void* )
{
Mat dst, dst_norm, dst_norm_scaled;
dst = Mat::zeros( OurImage.size(), CV_32FC1 );
/// Detector parameters
int blockSize = 2;
int apertureSize = 3;
double k = 0.04;
/// Detecting corners
cornerHarris( grayframe, dst, blockSize, apertureSize, k, BORDER_DEFAULT );
/// Normalizing
normalize( dst, dst_norm, 0, 200, NORM_MINMAX, CV_32FC1, Mat() );
convertScaleAbs( dst_norm, dst_norm_scaled );
/// Drawing a circle around corners
Point punkt;
vector <Point> Punkty;
int x,y,counter=0;
for( int j = 0; j < dst_norm.rows ; j++ )
{
for( int i = 0; i < dst_norm.cols; i++ )
{
if( (int) dst_norm.at<float>(j,i) > 80)
{
counter++;
circle( dst_norm_scaled, Point( i, j ), 25, Scalar(200,200,200), 2, 8, 0 );
punkt.x=i;
punkt.y=j;
Punkty.push_back(punkt);
cout << punkt<< endl;
}
}
}
cout <<counter<< endl;
cout << Punkty<< endl;
/// Showing the result
namedWindow( "corners_window", CV_WINDOW_AUTOSIZE );
imshow( "corners_window", dst_norm_scaled );
}