Пример #1
0
cv::Mat FSVision::subLaser(cv::Mat &laserOff, cv::Mat &laserOn, double threshold)
{
    unsigned int cols = laserOff.cols;
    unsigned int rows = laserOff.rows;
    cv::Mat bwLaserOff( cols,rows,CV_8U,cv::Scalar(100) );
    cv::Mat bwLaserOn( cols,rows,CV_8U,cv::Scalar(100) );
    cv::Mat diffImage( cols,rows,CV_8U,cv::Scalar(100) );
    cv::Mat treshImage( cols,rows,CV_8U,cv::Scalar(100) );
    cv::Mat result( cols,rows,CV_8UC3,cv::Scalar(100) );

    cv::cvtColor(laserOff, bwLaserOff, CV_RGB2GRAY); //convert to grayscale
    cv::cvtColor(laserOn, bwLaserOn, CV_RGB2GRAY); //convert to grayscale
    cv::subtract(bwLaserOn,bwLaserOff,diffImage); //subtract both grayscales
    cv::GaussianBlur(diffImage,diffImage,cv::Size(5,5),3); //gaussian filter
    cv::threshold(diffImage,treshImage,threshold,255,cv::THRESH_BINARY); //apply threshold
    cv::Mat element5(3,3,CV_8U,cv::Scalar(1));
    cv::morphologyEx(treshImage,treshImage,cv::MORPH_OPEN,element5);

    cv::cvtColor(treshImage, result, CV_GRAY2RGB); //convert back ro rgb
    /*cv::namedWindow("laserLine");
    cv::imshow("laserLine", result);
    cv::waitKey(0);
    cv::destroyWindow("laserLine");*/
    return result;
}
Пример #2
0
cv::Mat FSVision::diffImage(cv::Mat &laserOff, cv::Mat &laserOn)
{
    unsigned int cols = laserOff.cols;
    unsigned int rows = laserOff.rows;
    cv::Mat bwLaserOff( cols,rows,CV_8U,cv::Scalar(100) );
    cv::Mat bwLaserOn( cols,rows,CV_8U,cv::Scalar(100) );
    cv::Mat diffImage( cols,rows,CV_8U,cv::Scalar(100) );
    cv::Mat result( cols,rows,CV_8UC3,cv::Scalar(100) );
    cv::cvtColor(laserOff, bwLaserOff, CV_RGB2GRAY); //convert to grayscale
    cv::cvtColor(laserOn, bwLaserOn, CV_RGB2GRAY); //convert to grayscale
    cv::subtract(bwLaserOn,bwLaserOff,diffImage); //subtract both grayscales
    cv::cvtColor(diffImage, result, CV_GRAY2RGB); //convert back ro rgb
    return result;
}
Пример #3
0
cv::Mat FSVision::subLaser2(cv::Mat &laserOff, cv::Mat &laserOn,int JD)
{
    unsigned int cols = laserOff.cols;
    unsigned int rows = laserOff.rows;
    cv::Mat bwLaserOff( rows,cols,CV_8U,cv::Scalar(100) );
    cv::Mat bwLaserOn( rows,cols,CV_8U,cv::Scalar(100) );
    cv::Mat tresh2Image( rows,cols,CV_8U,cv::Scalar(0) );
    cv::Mat diffImage( rows,cols,CV_8U,cv::Scalar(100) );
    cv::Mat gaussImage( rows,cols,CV_8U,cv::Scalar(0) );
    cv::Mat laserImage( rows,cols,CV_8U,cv::Scalar(0) );
    cv::Mat result( rows,cols,CV_8UC3,cv::Scalar(0) );

    std::vector<cv::Mat> rgbChannelsOff(3);
    cv::split(laserOff, rgbChannelsOff);

    // cv::cvtColor(laserOff, bwLaserOff, CV_RGB2GRAY);//convert to grayscale
    bwLaserOff=rgbChannelsOff[0];
    //cv::imshow("laserLineOff", bwLaserOff);  cv::waitKey(10);

    std::vector<cv::Mat> rgbChannelsOn(3);
    cv::split(laserOn, rgbChannelsOn);




    // cv::cvtColor(laserOn, bwLaserOn, CV_RGB2GRAY); //convert to grayscale
    bwLaserOn = rgbChannelsOn[0];



    //





    cv::subtract(bwLaserOn,bwLaserOff,diffImage); //subtract both grayscales

    // cv::cvtColor(laserOn, diffImage, CV_RGB2GRAY);


    tresh2Image = diffImage.clone();
    //cv::imshow("tresh2Image1", tresh2Image);  cv::waitKey(10);
    //细化测试
    cv::Mat img=tresh2Image.clone();

    //cv::equalizeHist(img,img);

    cv::blur(img,img, cv::Size(5,5));
    //cv::imshow("tresh2Image1_2", img);  cv::waitKey(10);





    cv::threshold(img, img,40, 255, cv::THRESH_BINARY);
    cv::blur(img,img, cv::Size(3,3));
    char buffer [256];

    if(JD%4==0)
    {
        JD=JD/4;
        sprintf (buffer, "D:\\img\\img1\\sd_spline-%d.jpg",JD);
        cv::imwrite(buffer,img);
        sprintf (buffer, "D:\\img\\img2\\tex_image-%d.jpg",JD);
        cv::imwrite(buffer,laserOff);

    }

    normalizeLetter(img,img);  //很好的细化
//	cv::imshow("tresh2Image2", img);  cv::waitKey(10);
//		img.convertTo(img,CV_32FC1);


    //	skeletonize(img);  //很好的细化

//cv::blur(img,img, cv::Size(3,3));
// cv::imshow("tresh2Image3", img);  cv::waitKey(0);
    /*

     cv::blur(img,img, cv::Size(3,3));

    cv::Mat element = cv::getStructuringElement(cv::MORPH_CROSS, cv::Size(3, 3));


    cv::erode(img, img, element); // cv::imshow("tresh2Image3", img);  cv::waitKey(1000);
     cv::dilate(img, img, element);
    cv::dilate(img, img, element);
    //  cv::dilate(img, img, element);
     	 cv::blur(img,img, cv::Size(5,5));

    	 cv::imshow("tresh2Image2_2", img);  cv::waitKey(10);




     cv::imshow("tresh2Image3", img);  cv::waitKey(10);
    // cv::blur(img,img, cv::Size(3,3));

     cv::Mat element2 = cv::getStructuringElement(cv::MORPH_CROSS, cv::Size(3, 3));

     cv::dilate(img, img, element2);//  cv::dilate(img, img, element);
     cv::blur(img,img, cv::Size(3,3));
    // cv::erode(img, img, element2);

      cv::imshow("tresh2Image4", img);  cv::waitKey(0);

     //	atfx atf ;// = new atfx();
    	//        atf.setInputSketch(1-img);

    	  //    cv::Mat thinned_image = atf.getATFImage();

    // cv::imshow("tresh2Image4", img);  cv::waitKey(10);
    // skeletonize(img);  //很好的细化

    //cv::imshow("tresh2Image5", img);  cv::waitKey(10);
    // cv::dilate(img, img, element2);

    // cv::imshow("tresh2Image6", img);  cv::waitKey(0);
    ////
    //cv::namedWindow("tresh2Image2",0);
    //cv::imshow("tresh2Image2", img);  //cv::waitKey(10);

    //diffImage =img.clone();

    //	   cv::cvtColor(laserImage, result, CV_GRAY2RGB); //convert back ro rgb
    //return result;






    //细化
    //void cvThin (IplImage* src, IplImage* dst, int iterations)
    //cvThreshold


    //	cv::blur(tresh2Image,tresh2Image, cv::Size(3,3));



    // Apply the specified morphology operation
    //cv::imshow("laserLine", FSVision::histogram(diffImage));
    //cv::waitKey(0);

    //cv::imshow("laserLine", diffImage);
    //cv::waitKey(0);
    cv::GaussianBlur(diffImage,gaussImage,cv::Size(15,15),12,12);
    diffImage = diffImage-gaussImage;
    //cv::imshow("laserLine", diffImage);
    //cv::waitKey(0);
    double threshold = 10;
    cv::threshold(diffImage,diffImage,threshold,255,cv::THRESH_TOZERO); //apply threshold
    //cv::imshow("laserLine", FSVision::histogram(diffImage));
    //cv::waitKey(0);
    //cv::equalizeHist(diffImage,diffImage);
    //cv::imshow("laserLine", FSVision::histogram(diffImage));
    //cv::waitKey(0);
    cv::erode(diffImage,diffImage,cv::Mat(3,3,CV_8U,cv::Scalar(1)) );
    //cv::imshow("laserLine", diffImage);
    //cv::waitKey(0);

    //cv::Mat element5(3,3,CV_8U,cv::Scalar(1));
    //cv::morphologyEx(diffImage,diffImage,cv::MORPH_OPEN,element5);
    //cv::imshow("laserLine", diffImage);
    //cv::waitKey(0);
    cv::Canny(diffImage,diffImage,20,50);
    //cv::imshow("laserLine", diffImage);
    //cv::waitKey(0);
    //cv::imshow("laserLine", treshImage+diffImage);
    //cv::waitKey(0);
    //cv::destroyWindow("laserLine");




    int *edges;

    edges=new int[cols]; //contains the cols index of the detected edges per row

    for(unsigned int y = 0; y <rows; y++){
    	//reset the detected edges
    	for(unsigned int j=0; j<cols; j++){ edges[j]=-1; }
    	int j=0;
    	for(unsigned int x = 0; x<cols; x++){
    		if(diffImage.at<uchar>(y,x)>250){
    			edges[j]=x;
    			j++;
    		}
    	}
    	//iterate over detected edges, take middle of two edges
    	for(unsigned int j=0; j<cols-1; j+=2){
    		if(edges[j]>=0 && edges[j+1]>=0 && edges[j+1]-edges[j]<40){
    			int middle = (int)(edges[j]+edges[j+1])/2;
    			//qDebug() << cols << rows << y << middle;
    			laserImage.at<uchar>(y,middle) = 255;
    		}
    	}
    }

    */

    for(unsigned int y = 0; y <img.rows ; y++)
    {
        for(unsigned int x = 0; x<img.cols; x++)
        {

            if(img.at<int>(y,x)>99) {
                laserImage.at<uchar>(y,x) = 255;
            }
            else
            {
                laserImage.at<uchar>(y,x) = 0;
            }
        }
    }




//	cv::namedWindow("laserLine",0);
    //cv::imshow("laserLine", diffImage);

//	cv::imshow("laserLine", laserImage);







    //cv::waitKey(0);
    //  cv::imshow("laserLine", laser+treshImage);
    //   cv::waitKey(0);
    //cv::destroyAllWindows();


    cv::cvtColor(laserImage, result, CV_GRAY2RGB); //convert back ro rgb
    return result;
}
Пример #4
0
cv::Mat CSVision::subLaser2(cv::Mat &laserOff, cv::Mat &laserOn)
{
    unsigned int cols = laserOff.cols;
    unsigned int rows = laserOff.rows;
    cv::Mat bwLaserOff( rows,cols,CV_8U,cv::Scalar(100) );
    cv::Mat bwLaserOn( rows,cols,CV_8U,cv::Scalar(100) );
    cv::Mat tresh2Image( rows,cols,CV_8U,cv::Scalar(0) );
    cv::Mat diffImage( rows,cols,CV_8U,cv::Scalar(100) );
    cv::Mat gaussImage( rows,cols,CV_8U,cv::Scalar(0) );
    cv::Mat laserImage( rows,cols,CV_8U,cv::Scalar(0) );
    cv::Mat result( rows,cols,CV_8UC3,cv::Scalar(0) );
 cv::Mat mresult( rows,cols,CV_8UC3,cv::Scalar(0) );

     cv::absdiff(laserOn,laserOff,mresult); //subtract both grayscales
     cv::threshold(mresult,mresult,12,255,cv::THRESH_BINARY); //CEB temp remove

    // cv::imshow("color absdiff", mresult);



  //  cv::cvtColor(laserOff, bwLaserOff, CV_RGB2GRAY);//convert to grayscale
 //  cv::cvtColor(laserOn, bwLaserOn, CV_RGB2GRAY); //convert to grayscale


   // cv::subtract(bwLaserOn,bwLaserOff,diffImage); //subtract both grayscales // CEB good


  //  cv::absdiff(bwLaserOn,bwLaserOff,diffImage); //subtract both grayscales
 //   tresh2Image = diffImage.clone();

  //  cv::namedWindow("Before Image");
//   cv::imshow("subtract", diffImage);

     cv::cvtColor(mresult,diffImage, CV_RGB2GRAY);//convert to grayscale
  //   cv::imshow("subtract", diffImage);

     // cv::waitKey(0);

    // Apply the specified morphology operation
    //cv::imshow("laserLine", FSVision::histogram(diffImage));
    //cv::waitKey(0);
    /*int morph_elem = 0;
    int morph_size = 1;
  //  cv::Canny(diffImage,diffImage,20,50);
    cv::Mat element = cv::getStructuringElement(
                morph_elem,
                cv::Size( 2*morph_size + 1, 2*morph_size+1 ),
                cv::Point( morph_size, morph_size ) );
    cv::morphologyEx(diffImage, diffImage, cv::MORPH_OPEN, element);*/
    //cv::imshow("laserLine", diffImage);
    //cv::waitKey(0);
  //   cv::imshow("Before Blur ", diffImage); CEB
 //   cv::GaussianBlur(diffImage,gaussImage,cv::Size(15,15),12,12); // remove CEB
 //    cv::imshow("Gauss image ", gaussImage);
 //   diffImage = diffImage-gaussImage; // CEB removed
  //  cv::imshow("Blur", diffImage);
 //   cv::waitKey(0);
  // FSFloat threshold = 10;
 // cv::imshow("Before threshold", diffImage);
  // cv::threshold(diffImage,diffImage,threshold,255,cv::THRESH_TOZERO);  //apply threshold
   cv::threshold(diffImage,diffImage,11,255,cv::THRESH_BINARY); //CEB  good
//    cv::threshold(diffImage,diffImage,11,255,cv::THRESH_BINARY); //CEB temp remove
    // cv::threshold(diffImage,diffImage,threshold,255,cv::THRESH_OTSU); //CEB worked
   //  cv::threshold(diffImage,diffImage,threshold,255,cv::THRESH_TOZERO);
  //  cv::imshow("After threshold", diffImage);

  //  cv::imshow("threshold", CSVision::histogram(diffImage));
 //  cv::waitKey(0);
  //  cv::equalizeHist(diffImage,diffImage); // ceb worked
//  cv::imshow("threshhold", diffImage);
   // cv::waitKey(0);



   //cv::erode(diffImage,diffImage,cv::Mat(3,3,CV_8U,cv::Scalar(1)) ); CEB removing to test
    cv::erode(diffImage,diffImage,cv::Mat(3,3,CV_8U,cv::Scalar(1)) );
 //cv::imshow("Erode", diffImage);

    cv::dilate(diffImage,diffImage,cv::Mat(3,3,CV_8U,cv::Scalar(1)) );

  // cv::imshow("After", diffImage);



  //  cv::imshow("laserLine", diffImage);
  //  cv::waitKey(0);

  //  cv::Mat element5(3,3,CV_8U,cv::Scalar(1)); // ceb worked
  //   cv::morphologyEx(diffImage,diffImage,cv::MORPH_OPEN,element5); // ceb worked
 //   cv::imshow("laserLine", diffImage);
  //  cv::waitKey(0);
  //  cv::Canny(diffImage,diffImage,20,50); CEB
  //  cv::imshow("laserLine", diffImage);
 //  cv::waitKey(0);
  //  cv::imshow("laserLine", treshImage+diffImage);
  //  cv::waitKey(0);
 //   cv::destroyWindow("laserLine");
/*
    int edges[cols]; //contains the cols index of the detected edges per row
    for(unsigned int y = 0; y <rows; y++){
        //reset the detected edges
        for(unsigned int j=0; j<cols; j++){ edges[j]=-1; }
        int j=0;
        for(unsigned int x = 0; x<cols; x++){
            if(diffImage.at<uchar>(y,x)>250){
                edges[j]=x;
                j++;
            }
        }


        //iterate over detected edges, take middle of two edges

        for(unsigned int j=0; j<cols-1; j+=2)
  //  cv::Canny(diffImage,diffImage,20,50);
        {
            //cv::imshow("laserBasic", laserBasic);
   // cv::waitKey(0);
            if(edges[j]>=0 && edges[j+1]>=0 && edges[j+1]-edges[j]<40){
                int middle = (int)(edges[j]+edges[j+1])/2;
                //qDebug() << cols << rows << y << middle;
                laserImage.at<uchar>(y,middle) = 255;
            }
       }/
    }

            int edges[cols]; //contains the cols index of the detected edges per row
    for(unsigned int y = 0; y <rows; y++){
        //reset the detected edges
        for(unsig/ned int j=0; j<cols; j++){ edges[j]=-1; }
        int j=0;cv::imshow("laserBasic", laserBasic);
    cv::waitKey(0);
        for(unsigned int x = 0; x<cols; x++){
            if(diffImage.at<uchar>(y,x)>250){
                edges[j]=x;
                j++;
            }
        }
        //iterate over detected edges, take middle of two edges
        for(unsigned int j=0; j<cols-1; j+=2){
            if(edges[j]>=0 && edges[j+1]>=0 && edges[j+1]-edges[j]<40){
                int middle = (int)(edges[j]+edges[j+1])/2;
                //qDebug() << cols << rows << y << middle;
                laserImage.at<uchar>(y,middle) = 255;
            }
        }
    }
        }
    } */
    /*
    cv::namedWindow("laserLine");
    cv::imshow("laserLine", diffImage);
    cv::waitKey(0);
    cv::imshow("laserLine", laserImage);
    cv::waitKey(0);
    cv::imshow("laserLine", laser+treshImage);
    cv::waitKey(0);
    cv::destroyAllWindows();*/
/* CEB
    cv::absdiff(laserOff, laserOn, result);
    cv::Mat channel[3];
    cv::split(result,channel);








    cv::Mat laserBasic( rows,cols,CV_8U,cv::Scalar(0) );
    laserBasic = channel[2];

    cv::threshold(laserBasic,laserBasic,20,255,cv::THRESH_OTSU);

    cv::Mat laserFocus( rows,cols,CV_8U,cv::Scalar(0) );
*/
    int edges[cols]; //contains the cols index of the detected edges per row
    for(unsigned int y = 0; y <rows; y++){
        //reset the detected edges
        for(unsigned int j=0; j<cols; j++){ edges[j]=-1; }
        int j=0;
        for(unsigned int x = 0; x<cols; x++){
          //  if(laserBasic.at<uchar>(y,x)>250){  ceb
         if(diffImage.at<uchar>(y,x)>250){
                edges[j]=x;
                j++;
            }
        }
        //iterate over detected edges, take middle of two edges
        for(unsigned int j=0; j<cols-1; j+=2){
            if(edges[j]>=0 && edges[j+1]>=0 && edges[j+1]-edges[j]<40){
                int middle = (int)(edges[j]+edges[j+1])/2;
                //qDebug() << cols << rows << y << middle;
               // laserFocus.at<uchar>(y,middle) = 255; CEB
                  laserImage.at<uchar>(y,middle) = 255;
            }
        }
    }

    //  cv::cvtColor(laserFocus, result, CV_GRAY2RGB); //convert back ro rgb //CEB
 cv::cvtColor(laserImage, result, CV_GRAY2RGB); //convert back ro rgb //CEB

    return result;
}
Пример #5
0
cv::Mat FSVision::subLaser2(cv::Mat &laserOff, cv::Mat &laserOn)
{
    unsigned int cols = laserOff.cols;
    unsigned int rows = laserOff.rows;
    cv::Mat bwLaserOff( rows,cols,CV_8U,cv::Scalar(100) );
    cv::Mat bwLaserOn( rows,cols,CV_8U,cv::Scalar(100) );
    cv::Mat tresh2Image( rows,cols,CV_8U,cv::Scalar(0) );
    cv::Mat diffImage( rows,cols,CV_8U,cv::Scalar(100) );
    cv::Mat gaussImage( rows,cols,CV_8U,cv::Scalar(0) );
    cv::Mat laserImage( rows,cols,CV_8U,cv::Scalar(0) );
    cv::Mat result( rows,cols,CV_8UC3,cv::Scalar(0) );

    cv::cvtColor(laserOff, bwLaserOff, CV_RGB2GRAY);//convert to grayscale
    cv::cvtColor(laserOn, bwLaserOn, CV_RGB2GRAY); //convert to grayscale
    cv::subtract(bwLaserOn,bwLaserOff,diffImage); //subtract both grayscales
    tresh2Image = diffImage.clone();

    /*cv::namedWindow("laserLine");
    cv::imshow("laserLine", diffImage);
    cv::waitKey(0);*/

    // Apply the specified morphology operation
    //cv::imshow("laserLine", FSVision::histogram(diffImage));
    //cv::waitKey(0);
    /*int morph_elem = 0;
    int morph_size = 1;
    cv::Mat element = cv::getStructuringElement(
                morph_elem,
                cv::Size( 2*morph_size + 1, 2*morph_size+1 ),
                cv::Point( morph_size, morph_size ) );
    cv::morphologyEx(diffImage, diffImage, cv::MORPH_OPEN, element);*/
    //cv::imshow("laserLine", diffImage);
    //cv::waitKey(0);
    cv::GaussianBlur(diffImage,gaussImage,cv::Size(15,15),12,12);
    diffImage = diffImage-gaussImage;
    //cv::imshow("laserLine", diffImage);
    //cv::waitKey(0);
    FSFloat threshold = 10;
    cv::threshold(diffImage,diffImage,threshold,255,cv::THRESH_TOZERO); //apply threshold
    //cv::imshow("laserLine", FSVision::histogram(diffImage));
    //cv::waitKey(0);
    //cv::equalizeHist(diffImage,diffImage);
    //cv::imshow("laserLine", FSVision::histogram(diffImage));
    //cv::waitKey(0);
    cv::erode(diffImage,diffImage,cv::Mat(3,3,CV_8U,cv::Scalar(1)) );
    //cv::imshow("laserLine", diffImage);
    //cv::waitKey(0);

    //cv::Mat element5(3,3,CV_8U,cv::Scalar(1));
    //cv::morphologyEx(diffImage,diffImage,cv::MORPH_OPEN,element5);
    //cv::imshow("laserLine", diffImage);
    //cv::waitKey(0);
    cv::Canny(diffImage,diffImage,20,50);
    //cv::imshow("laserLine", diffImage);
    //cv::waitKey(0);
    //cv::imshow("laserLine", treshImage+diffImage);
    //cv::waitKey(0);
    //cv::destroyWindow("laserLine");

    int edges[cols]; //contains the cols index of the detected edges per row
    for(unsigned int y = 0; y <rows; y++){
        //reset the detected edges
        for(unsigned int j=0; j<cols; j++){ edges[j]=-1; }
        int j=0;
        for(unsigned int x = 0; x<cols; x++){
            if(diffImage.at<uchar>(y,x)>250){
                edges[j]=x;
                j++;
            }
        }
        //iterate over detected edges, take middle of two edges
        for(unsigned int j=0; j<cols-1; j+=2){
            if(edges[j]>=0 && edges[j+1]>=0 && edges[j+1]-edges[j]<40){
                int middle = (int)(edges[j]+edges[j+1])/2;
                //qDebug() << cols << rows << y << middle;
                laserImage.at<uchar>(y,middle) = 255;
            }
        }
    }
    /*cv::namedWindow("laserLine");
    cv::imshow("laserLine", diffImage);
    cv::waitKey(0);
    cv::imshow("laserLine", laserImage);
    cv::waitKey(0);
    cv::imshow("laserLine", laser+treshImage);
    cv::waitKey(0);
    cv::destroyAllWindows();*/
    cv::cvtColor(laserImage, result, CV_GRAY2RGB); //convert back ro rgb
    return result;
}