Beispiel #1
0
void BlobDetectorNode::update() {
    // if more than 2 seconds have passed and no messages have been received,
    // stop sending
    if((ros::Time::now()-t_depth).toSec()>1.0) {
	return;
    }
        
    //convert image to openCV image
    cv_bridge::CvImagePtr cv_ptr = convertImage();
    //normalize image, remove max values
    //    cv_ptr = normalize(cv_ptr);
    //if(1) return;

    //detect blobs in image
    vector<KeyPoint> points = detectBlobs(cv_ptr);
    //pick the closest blob
    KeyPoint kp = getClosestBlob(points,cv_ptr);
    
    ROS_INFO_STREAM("x cor: " << kp.pt.x << " distance: " << kp.pt.y);

    // calculate kinematics and send twist to robot simulation node
    geometry_msgs::Twist twist_msg;

    twist_msg.linear.x = kp.pt.x;
    twist_msg.linear.y = 0.0;
    twist_msg.linear.z = kp.pt.y;

    twist_msg.angular.x = 0.0;
    twist_msg.angular.y = 0.0;
    twist_msg.angular.z = 0.0;

    blob_publisher.publish(twist_msg);
}
Beispiel #2
0
/* Callback function to handle ros image messages
 * 
 * PARAMETERS:
 * 			-the pointer that contains the color image 
 * 			 and its metadata
 * 
 * RETURN: --
 */
void Chroma_processing::imageCb(const sensor_msgs::ImageConstPtr& msg)
{
	
	cv_bridge::CvImagePtr cv_ptr;
	int rows;
	int cols;
	int channels;
	int size;
	
	try
	{
	  cv_ptr = cv_bridge::toCvCopy(msg, sensor_msgs::image_encodings::MONO8);	  
	}
	catch (cv_bridge::Exception& e)
	{
	  ROS_ERROR("cv_bridge exception: %s", e.what());
	  return;
	}

	cur_rgb = (cv_ptr->image).clone();
	
	// contrast fix
	cur_rgb.convertTo(cur_rgb, -1, 4, 0);
	
	// gamma correction
	gammaCorrection(cur_rgb);
	

	// First run variable initialization 
	if(frameCounter == -1 )
	{
		rows 	 = cur_rgb.rows;
		cols 	 = cur_rgb.cols;
		channels = cur_rgb.channels();
		size 	 = rows*cols*channels;
		ref_rgb  = cur_rgb.clone();
		
		frameCounter++;
	}
	
	//~ medianBlur(dif_rgb, dif_rgb, 3);
	frameDif(cur_rgb, ref_rgb, dif_rgb, 255*0.33);
	ref_rgb = cur_rgb.clone();

	
	//Display
	 
	//Blob detection
	if(display)
	{
		detectBlobs(dif_rgb, rgb_rects, 15);
		
		Mat temp = dif_rgb.clone();
	    for(Rect rect: rgb_rects)
			rectangle(temp, rect, 255, 1);
		rgb_rects.clear();
		
		imshow("dif_rgb", temp);
		moveWindow("dif_rgb", 0, 0);
		imshow("cur_rgb", cur_rgb);
		moveWindow("cur_rgb", 645, 0);
		waitKey(1);
	}
	
	///////////////////////////////
	///////////////////////////////

	/*  Image background estimation	
	 * 
	 * 
	cur_rgb = (cv_ptr->image).clone();
	
	// Edge detection and background estimation
	int kernel_size = 3;
	int scale = 1;
	int delta = 0;
	int ddepth = CV_16S;
	
	
	cur_rgb.convertTo(cur_rgb, -1, 2, 0);
    gammaCorrection(cur_rgb);
	//~ GaussianBlur( cur_rgb, cur_rgb, Size(3,3), 0, 0, BORDER_DEFAULT );

	medianBlur(cur_rgb, cur_rgb, 3);
	Laplacian( cur_rgb, cur_rgb, ddepth, kernel_size, scale, delta, BORDER_DEFAULT );
	convertScaleAbs( cur_rgb, cur_rgb );
	

    estimateBackground(cur_rgb, back_Mat, rgb_storage, 500, 0.04);
    Mat temp_Mat = cur_rgb.clone();
    estimateForeground(cur_rgb, back_Mat, temp_Mat);
    medianBlur(temp_Mat, temp_Mat, 7);
    adaptiveThreshold(temp_Mat, temp_Mat, 255, ADAPTIVE_THRESH_GAUSSIAN_C, THRESH_BINARY, 9, -15);
    
    vector< Rect_<int> > back_rects;
    detectBlobs(temp_Mat, back_rects, 15);
	
    imshow("temp_Mat", temp_Mat);
	moveWindow("temp_Mat", 645, 0);
	*/
	
	has_image = true;
	waitKey(1);
	
	cv_ptr->image = cur_rgb;
	image_pub.publish(cv_ptr->toImageMsg());
	
	cv_ptr->image = dif_rgb;
	image_pub_dif.publish(cv_ptr->toImageMsg());
	
}
Beispiel #3
0
int main(int argc, char **argv)
{
    create_window("Original");
    create_window("Result");

    cvMoveWindow("Original", 10, 200);
    cvMoveWindow("Result", 20 + WND_WIDTH, 200);

    const char *optstr = "d";
    int ch;

    while ((ch = getopt(argc, argv, optstr)) != EOF) {
        switch (ch)
        {
        case 'd':
            debug = 1;
            break;
        }
    }

    if ((argc - optind) > 2) {

        std::ofstream fWolf;
        std::ofstream fSpotCatalog;

        fWolf.open ("/Users/eduardo/Wolfs.txt");
        fSpotCatalog.open ("/Users/eduardo/SpotCatalog.txt");

        fSpotCatalog << "Image;Date;Spot Id;Lat;Lon;Area;Intensity Relative;Mag Avg;Mag Avg Pos;Mag Avg Neg;Sun Intensity Avg; Sun Intensity Max; Sun Intensity Min" << std::endl;

        for (int i = optind; i < argc; ++i) {
            IplImage *src = cvLoadImage(argv[i]);
            if (debug)
                cvShowImage("Original", src);
            IplImage *dst = detect_sunspots(src);

            blob_collection b = detectBlobs(dst);

            std::cout << "Found " << b.size() << " sunspots in image " << argv[i] << std::endl;

            //struct_sun sun = center_sun(src, debug);

            fitsToolMDIContinum oFitMDIcontinum;
            fitsToolMag oFitMag;

            oFitMDIcontinum.openFit(argv[i]);

            struct_sun sun;

            oFitMDIcontinum.sunPhysics(&sun);

            std::string date;

            oFitMDIcontinum.dateObs(date);

            std::cout << "SD X0 = " << sun.center.x << " Y0 = " << sun.center.y << " Radius = " << sun.radius  << " Date:" << date << std::endl;

            group_sunspot_vector groups = count_groups(sun, b, debug? dst : NULL);

            std::cout << "groups found:" << groups.size() << std::endl;

            std::cout << "Wolf number " << b.size() + (groups.size() * 10) << " sunspots in image " << argv[i] << std::endl;

            double dIntensity;
            double dMin;
            double dMax;

            oFitMDIcontinum.sunMeanIntensity(&dIntensity, &dMin, &dMax);

            fWolf << argv[i] << ";"<< b.size() + (groups.size() * 10) << ";" << dMax << ";" << date << std::endl;

            oFitMag.openFit(argv[i]);

            blob_collection::iterator iter;

            int icnt = 0;

            for (iter = b.begin(); iter != b.end(); iter++)
            {
                double dMagAverage, dMagAveragePos, dMagAverageNeg, dArea, dIntensityAvg;

                oFitMag.magFieldAverage(iter->second.listPoints, &dMagAverage, &dMagAveragePos, &dMagAverageNeg);
                oFitMDIcontinum.Area(&(iter->second), &dArea);
                oFitMDIcontinum.IntensityAverage(iter->second.listPoints, &dIntensityAvg);

                std::cout  << "/t" << iter->first << "| Center:" << iter->second.getLatDeg() << "," << iter->second.getLonDeg() << "| Points : " << iter->second.listPoints.size() << "| AREA : " << dArea << "| Intensidade " << dIntensityAvg / dIntensity << "| Mag:" << dMagAverage << " : " << dMagAveragePos << " : " << dMagAverageNeg << std::endl;

                fSpotCatalog << argv[i] << ";" << date << ";" << icnt << ";" << iter->second.getLatDeg() << ";" << iter->second.getLonDeg() << ";" << dArea << ";" <<  dIntensityAvg / dIntensity << ";" << dMagAverage << ";" << dMagAveragePos << ";" << dMagAverageNeg << ";" << dIntensity << ";" << dMax << ";" << dMin  << std::endl;;

                ++icnt;


            }

            oFitMDIcontinum.closeFit();
            oFitMag.closeFit();

            cvShowImage("Original", src);
            cvShowImage("Result", dst);

            /*double dIntensity;

            openFit(argv[i]);
            sunMeanIntensity(&dIntensity);

            std::cout << "Sun Intensity: " << dIntensity;
            */

            oFitMDIcontinum.closeFit();

            cvWaitKey(5);
            cvReleaseImage(&src);
            cvReleaseImage(&dst);
        }
        fWolf.close();
        fSpotCatalog.close();

    } else {
        IplImage *src = cvLoadImage(argv[optind]);
        if (debug)
            cvShowImage("Original", src);
        IplImage *dst = detect_sunspots(src);

        blob_collection b = detectBlobs(dst);

        std::cout << "Found " << b.size() << " sunspots in image " << argv[optind] << std::endl;

        fitsToolMDIContinum oFitMDIcontinum;
        fitsToolMag oFitMag;

        //struct_sun sun = center_sun(src, debug);

        oFitMDIcontinum.openFit(argv[optind]);

        struct_sun sun;

        oFitMDIcontinum.sunPhysics(&sun);

        std::string date;

        oFitMDIcontinum.dateObs(date);

        std::cout << "SDO X0 = " << sun.center.x << " Y0 = " << sun.center.y << " Radius = " << sun.radius << " Date:" << date << std::endl;

        group_sunspot_vector groups = count_groups(sun, b, debug? dst : NULL);

        std::cout << "groups found:" << groups.size() << std::endl;

        std::cout << "Wolf number: " << b.size() + (groups.size() * 10) << " sunspots in image " << argv[optind] << std::endl;

        if (!debug) {
            cvShowImage("Original", src);
            cvShowImage("Result", dst);

            std::cout << "Src Width:" << src->width << "\t" << "Height:"<< src->height << std::endl;
            std::cout << "Dst Width:" << dst->width << "\t" << "Height:"<< dst->height << std::endl;

        }

        double dIntensity;
        double dMin;
        double dMax;

        oFitMDIcontinum.sunMeanIntensity(&dIntensity, &dMin, &dMax);

        dMin = dIntensity * 0.75;

        std::cout << "Sun Intensity: " << dIntensity << std::endl;

        blob_collection::iterator iter;
        /*
        		int npoints=0;
        		double dspotInt=0;
                double dMagAverage = 0;
        */
        oFitMag.openFit(argv[optind]);


        for (iter = b.begin(); iter != b.end(); iter++)
        {
            double dMagAverage, dMagAveragePos, dMagAverageNeg, dArea, dIntensityAvg;

            oFitMag.magFieldAverage(iter->second.listPoints, &dMagAverage, &dMagAveragePos, &dMagAverageNeg);
            oFitMDIcontinum.Area(&(iter->second), &dArea);
            oFitMDIcontinum.IntensityAverage(iter->second.listPoints, &dIntensityAvg);

            std::cout << iter->first << "| Center:" << iter->second.getLatDeg() << "," << iter->second.getLonDeg() << "| Points : " << iter->second.listPoints.size() << "| AREA : " << dArea << "| Intensidade " << dIntensityAvg / dIntensity << "| Mag:" << dMagAverage << " : " << dMagAveragePos << " : " << dMagAverageNeg << std::endl;

            // intensidade mancha // center em graus // depois do primeiro teste 40 ou 50 // B/Int B/A Int/A | int média mancha / int central sol


            /*
                        iter->second.listPoints.clear();
            			std::cout << iter->first << "| Center:" << iter->second.center.x << "," << iter->second.center.y;
            			oFitMDIcontinum.reposCenterBlob(&(iter->second));
            			std::cout << "| Re-Center:" << iter->second.center.x << "," << iter->second.center.y;
            			oFitMDIcontinum.regionGrowing(iter->second.center, &npoints, &dspotInt, src, dMin, iter->second.listPoints);
            			std::cout << " | Points:" << npoints << "\t| Inyensity: " << dspotInt << std::endl;
             */
        }

        oFitMDIcontinum.closeFit();
        oFitMag.closeFit();

        while (27 == (cvWaitKey(0) & 0xff));

        cvDestroyAllWindows();
        cvReleaseImage(&src);
        cvReleaseImage(&dst);

    }

    return 0;
}