求RAW8里十字标的中心

#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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值