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