#include <opencv2/opencv.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>
#include <stdio.h>
#include <math.h>
using namespace cv;
using namespace std;
#define THRESHOLD 200
#define THRESHOLD_PIXEL 30
#define FIRSTFLAG 0
#define SECONDFLAG 0
#define THIRDFLAG 4200
#define FORTHFLAG 4511
static Mat readRawDataImage(const char *);
static Point2d findCenter(Mat &inputImage);
static Point2d calculateCrossCenter(Point2d & ,Point2d &,Point2d &,Point2d & , Mat &);
static int imageHeight = 4512;
static int imageWeight = 6016;
int main( )
{
char imageName[] = "/home/solitary/Documents/01-6016X4512.raw" ;
Mat srcImage;
Mat _srcImage ;
readRawDataImage(imageName).copyTo(srcImage);
Point2d centerPoint = findCenter(srcImage);
cout<<"the center of cross in main = "<<" ["<<centerPoint.x<<", "<<centerPoint.y<<"]"<<endl;
circle(srcImage,centerPoint,2,Scalar(255,255,255),2,18);
Point2d point_LT(2793,2228);
Point2d point_RT(3079,2234);
Point2d point_RB(3074,2521);
Point2d point_LB(2787,2515);
line(srcImage,point_LT,point_RB,Scalar(255,255,255),1,18);
line(srcImage,point_RT,point_LB,Scalar(255,255,255),1,18);
namedWindow("center",WINDOW_NORMAL);
imshow("center",srcImage);
waitKey(0);
return 0;
}
static Mat readRawDataImage(const char* imageName)
{
FILE *filePointer;
if(nullptr == (filePointer = fopen(imageName,"rb+")))
{
cout<< "file is not exsit" <<endl;
}
Mat rawData;
#if 0
rawData = Mat(imageHeight,imageWeight/4*3,CV_8UC3,cv::Scalar(0));
Mat_<Vec3b>::iterator it;
for (it = rawData.begin<Vec3b>();it!=rawData.end<Vec3b>();++it)
{
if(fread( &((*it)[2]), 1 ,1,filePointer)!=1) //R
{
cout<<"read data frow raw image failed!"<<endl;
break;
}
uchar gr,gb;
if(fread( &gr, 1 ,1,filePointer)!=1) //GR
{
cout<<"read data frow raw image failed!"<<endl;
break;
}
if(fread( &gb, 1 ,1,filePointer)!=1) //GB
{
cout<<"read data frow raw image failed!"<<endl;
break;
}
(*it)[1] =saturate_cast<uchar>((gr+gb)/2);
if(fread( &((*it)[0]), 1 ,1,filePointer)!=1) //B
{
cout<<"read data frow raw image failed!"<<endl;
break;
}
}
namedWindow("my",WINDOW_GUI_NORMAL);
imshow("my",rawData);
waitKey(0);
#elif 0
rawData = Mat(imageHeight,imageWeight,CV_8UC1,cv::Scalar(0));
for (int i = 0;i < imageHeight;++i)
{
uchar *p = rawData.ptr<uchar>(i);
if(fread(p , 1 ,static_cast<size_t>(imageWeight), filePointer)!=static_cast<size_t>(imageWeight))
{
cout<<"read data frow raw image failed!"<<endl;
}
}
namedWindow("my",WINDOW_GUI_NORMAL);
imshow("my",rawData);
#else
rawData = Mat(imageHeight,imageWeight,CV_8UC1,cv::Scalar(0));
for (int i = 0;i < imageHeight;++i)
{
uchar *p = rawData.ptr<uchar>(i);
if(fread(p , 1 ,static_cast<size_t>(imageWeight), filePointer)!=static_cast<size_t>(imageWeight))
{
cout<<"read data frow raw image failed!"<<endl;
}
// for (int j= 0 ;j<imageWeight;++j)
// {
// cout<<"("<<i<<" ,"<<0<<" ) "<<"pixel = "<<static_cast<ushort>(p[0])<<endl;
// }
}
namedWindow("my",WINDOW_NORMAL);
imshow("my",rawData);
#endif
fclose(filePointer);
return rawData;
}
static Point2d findCenter(Mat &inputImage)
{
//find (x1,y1)
double begin_point1_y = 0.0;
double end_point1_y = 0.0;
Point2d point1 ;
int i = 0;
while (i<imageHeight)
{
unsigned short index = 0;
bool findFirstPoint1 = false;
int temp = i;
while(1)
{
uchar *p = inputImage.ptr(temp);
if(THRESHOLD_PIXEL < p[FIRSTFLAG])
{
if(!findFirstPoint1)
begin_point1_y = temp;
findFirstPoint1=true;
index++;
++temp;
}else
{
break;
}
}
if(THRESHOLD < index)
{
end_point1_y = temp-1;
break;
}
i = temp+1;
}
point1.x = FIRSTFLAG ;
point1.y = ( end_point1_y - begin_point1_y) / 2 + begin_point1_y;
cout<<"first point = "<<" ["<<point1.x<<", "<<point1.y<<"]"<<endl;
//find (x2,y2)
double begin_point2_x = 0.0;
double end_point2_x = 0.0;
Point2d point2 ;
i = 0;
uchar *p2 = inputImage.ptr(SECONDFLAG);
while (i<imageWeight)
{
unsigned short index = 0;
bool findFirstPoint1 = false;
int temp = i;
while(1)
{
if(THRESHOLD_PIXEL < p2[temp])
{
if(!findFirstPoint1)
begin_point2_x = temp;
findFirstPoint1=true;
index++;
++temp;
}else
{
break;
}
}
if(THRESHOLD < index)
{
end_point2_x = temp-1;
break;
}
i = temp+1;
}
point2.x = ( end_point2_x - begin_point2_x) / 2 + begin_point2_x; ;
point2.y = SECONDFLAG;
cout<<"second point = "<<" ["<<point2.x<<", "<<point2.y<<"]"<<endl;
//find (x3,y3)
double begin_point3_y = 0.0;
double end_point3_y = 0.0;
Point2d point3 ;
i = 0;
while (i<imageHeight)
{
unsigned short index = 0;
bool findFirstPoint1 = false;
int temp = i;
while(1)
{
uchar *p = inputImage.ptr(temp);
if(THRESHOLD_PIXEL < p[THIRDFLAG])
{
if(!findFirstPoint1)
begin_point3_y = temp;
findFirstPoint1=true;
index++;
++temp;
}else
{
break;
}
}
if(THRESHOLD < index)
{
end_point3_y = temp-1;
break;
}
i = temp+1;
}
point3.x = THIRDFLAG ;
point3.y = ( end_point3_y - begin_point3_y) / 2 + begin_point3_y;
cout<<"Third point = "<<" ["<<point3.x<<", "<<point3.y<<"]"<<endl;
//find (x4,y4)
//find (x2,y2)
double begin_point4_x = 0.0;
double end_point4_x = 0.0;
Point2d point4 ;
i = 0;
uchar *p4 = inputImage.ptr(FORTHFLAG);
while (i<imageWeight)
{
unsigned short index = 0;
bool findFirstPoint1 = false;
int temp = i;
while(1)
{
if(THRESHOLD_PIXEL < p4[temp])
{
if(!findFirstPoint1)
begin_point4_x = temp;
findFirstPoint1=true;
index++;
++temp;
}else
{
break;
}
}
if(THRESHOLD < index)
{
end_point4_x = temp-1;
break;
}
i = temp+1;
}
point4.x = ( end_point4_x - begin_point4_x) / 2 + begin_point4_x; ;
point4.y = FORTHFLAG;
cout<<"Forth point = "<<" ["<<point4.x<<", "<<point4.y<<"]"<<endl;
Point2d center = calculateCrossCenter(point1,point2,point3,point4,inputImage);
line(inputImage,point1,point3,Scalar(255,255,255),1,18);
line(inputImage,point2,point4,Scalar(255,255,255),1,18);
return center;
}
static Point2d calculateCrossCenter(Point2d &point1,Point2d &point2,Point2d &point3,Point2d &point4,Mat &inputImage)
{
Point2d crossCenter;
const double eps_0 = 1.0e-6;
if(( point1.y - point3.y) >=-eps_0 && (point1.y - point3.y) <= eps_0)
{
crossCenter.y = point3.y / 2;
crossCenter.x = point3.x / 2;
}else
{
double k1 = (point3.y - point1.y) / (point3.x - point1.x) ;
double k2 = (point4.y - point2.y) / (point4.x - point2.x) ;
double denominator =k1 * point1.x - k2 * point2.x + point2.y - point1.y ;
double molecule = k1 - k2;
crossCenter.x = denominator / molecule ;
crossCenter.y = k1 * (crossCenter.x - point1.x) + point1.y;
cout<<"the center of cross = "<<" ["<<crossCenter.x<<", "<<crossCenter.y<<"]"<<endl;
}
return crossCenter;
}