예제 #1
0
FSPoint FSVision::detectLaserLine( cv::Mat &laserOff, cv::Mat &laserOn, unsigned int threshold )
{
    unsigned int cols = laserOff.cols;
    unsigned int rows = laserOff.rows;
    cv::Mat laserLine = subLaser2(laserOff, laserOn);
    std::vector<cv::Vec4i> lines;
    double deltaRho = 1;
    double deltaTheta = M_PI/2;
    int minVote = 20;
    double minLength = 50;
    double maxGap = 10;
    cv::Mat laserLineBW( cols, rows, CV_8U, cv::Scalar(0) );
    cv::cvtColor(laserLine, laserLineBW, CV_RGB2GRAY); //convert to grayscale

    /*cv::namedWindow("Detected Lines with HoughP");
    cv::imshow("Detected Lines with HoughP",laserLineBW);
    cv::waitKey(0);*/
    //cvDestroyWindow("Detected Lines with HoughP");

    cv::HoughLinesP( laserLineBW,
                     lines,
                     deltaRho,
                     deltaTheta,
                     minVote,
                     minLength,
                     maxGap );

    //should at least detect the laser line
    qDebug() << "detected"<<lines.size()<<"lines";
    if(lines.size()==0){
        qDebug("Did not detect any laser line, did you select a SerialPort form the menu?");
        FSPoint p = FSMakePoint(0.0,0.0,0.0);
        return(p);
    }
    //assert(lines.size()>0);
    //for(int i=0;i<lines.size();i++){
    cv::Point p1;
    cv::Point p2;
    for(unsigned int i=0;i<lines.size();i++){
        qDebug() << "drawing line "<<lines[i][0]<<lines[i][1]<<lines[i][2]<<lines[i][3];
        //int i = 0;
        p1.x = lines[i][0];
        p1.y = lines[i][1];
        p2.x = lines[i][2];
        p2.y = lines[i][3];
        cv::line(laserLine, p1, p2, CV_RGB( 255,0,0 ),1);   //draw laser line
     }



    /*cv::namedWindow("Detected Lines with HoughP");
    cv::imshow("Detected Lines with HoughP",laserLine);
    cv::waitKey(0);
    cvDestroyWindow("Detected Lines with HoughP");*/

    FSPoint p = convertCvPointToFSPoint(p1);
    return p;
}
예제 #2
0
FSPoint FSVision::detectLaserLine( cv::Mat &laserOff, cv::Mat &laserOn, unsigned int threshold, cv::Point *mP )
{

    IsFindLine=false;

    unsigned int cols = laserOff.cols;
    unsigned int rows = laserOff.rows;
    cv::Mat laserLine = subLaser2(laserOff, laserOn,1);
    std::vector<cv::Vec4i> lines;
    double deltaRho = 1;
    double deltaTheta = M_PI/2;
    int minVote = 20;
    double minLength = 50;
    double maxGap = 10;
    cv::Mat laserLineBW( cols, rows, CV_8U, cv::Scalar(0) );
    cv::cvtColor(laserLine, laserLineBW, CV_RGB2GRAY); //convert to grayscale

    cv::Mat mask( cols/2, rows/2-100, CV_8U, cv::Scalar(0) );


    cv::Rect rect(0, 0,cols/2, rows/2 - 100);
    laserLineBW(rect).copyTo(mask);


    //cv::imshow("extractedlaserLine3",mask);
    //cv::waitKey(100);

//	cv::namedWindow("Detected Lines with HoughP");

    //cvDestroyWindow("Detected Lines with HoughP");

    cv::HoughLinesP( mask,
                     lines,
                     deltaRho,
                     deltaTheta,
                     minVote,
                     minLength,
                     maxGap );


    cv::putText(mask,"",cv::Point(10,10),6,6,cv::Scalar(255,0,0),1,8,false);
    cv::imshow("extractedlaserLine2",mask);
    //cv::waitKey(0);

    //should at least detect the laser line
    qDebug() << "detected"<<lines.size()<<"lines";
    if(lines.size()==0) {
        qDebug("Did not detect any laser line, did you select a SerialPort form the menu?");
        FSPoint p = FSMakePoint(0.0,0.0,0.0);

        mP[0].x =0;
        mP[0].y =0;

        return(p);
    }
    //assert(lines.size()>0);
    //for(int i=0;i<lines.size();i++){
    cv::Point p1;
    cv::Point p2;
    for(int i=0; i<lines.size(); i++) {
        qDebug() << "drawing line "<<lines[i][0]<<lines[i][1]<<lines[i][2]<<lines[i][3];
        //int i = 0;
        p1.x = lines[i][0];
        p1.y = lines[i][1];
        p2.x = lines[i][2];
        p2.y = lines[i][3];
        cv::line(laserLine, p1, p2, CV_RGB( 255,0,0 ),1);   //draw laser line




        IsFindLine=true;
    }

    mP[0].x =p1.x;
    mP[0].y =p1.y;


    /*cv::namedWindow("Detected Lines with HoughP");
    cv::imshow("Detected Lines with HoughP",laserLine);
    cv::waitKey(100);
    cvDestroyWindow("Detected Lines with HoughP");
    */
    FSPoint p = convertCvPointToFSPoint(p1);
    return p;
}