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); }
/* 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()); }
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; }