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