void imageCallback(const sensor_msgs::ImageConstPtr& msg) { cv_bridge::CvImagePtr cv_ptr; try { cv_ptr = cv_bridge::toCvCopy(msg, sensor_msgs::image_encodings::BGR8); } catch (cv_bridge::Exception& e) { ROS_ERROR("cv_bridge exception: %s", e.what()); return; } // Draw an example circle on the video stream //if (cv_ptr->image.rows > 60 && cv_ptr->image.cols > 60) // cv::circle(cv_ptr->image, cv::Point(50, 50), 10, CV_RGB(255,0,0)); // Update GUI Window cv::imshow(OPENCV_WINDOW, cv_ptr->image); cv::waitKey(3); if(readyToFindWire == true) { // detect blobs cv::SimpleBlobDetector::Params params; params.minThreshold = 40; params.maxThreshold = 60; params.thresholdStep = 50; params.minArea = 100; params.minConvexity = 0.3; params.minInertiaRatio = 0.01; params.maxArea = 8000; params.maxConvexity = 10; params.filterByColor = true; params.filterByCircularity = false; cv::line( cv_ptr->image , cv::Point(0, cv_ptr->image.rows-1), cv::Point( cv_ptr->image.cols-1, cv_ptr->image.rows-1 ), cv::Scalar::all(255) ); cv::SimpleBlobDetector blobDetector( params ); blobDetector.create("SimpleBlob"); std::vector<cv::KeyPoint> keyPoints; std::vector< std::vector <cv::Point> > contours; std::vector< std::vector <cv::Point> > approxContours; cv::Mat out; blobDetector.detect( cv_ptr->image, keyPoints ); //blobDetector.detectEx( cv_ptr->image, keyPoints, contours ); cv::drawKeypoints( cv_ptr->image, keyPoints, out, CV_RGB(0,255,0), cv::DrawMatchesFlags::DEFAULT); approxContours.resize( contours.size() ); for( int i = 0; i < contours.size(); ++i ) { approxPolyDP( cv::Mat(contours[i]), approxContours[i], 4, 1 ); drawContours( out, contours, i, CV_RGB(rand()&255, rand()&255, rand()&255) ); cv::drawContours( out, approxContours, i, CV_RGB(rand()&255, rand()&255, rand()&255) ); } if (keyPoints.size() > 0) { std::cout << "Keypoints " << keyPoints.size() << std::endl; cv::imshow(OPENCV_WINDOW_K, out); //cv::waitKey(0); } } // Output modified video stream // image_pub_.publish(cv_ptr->toImageMsg()); }
int _tmain(int argc, _TCHAR* argv[]) { // initModule_nonfree();//if use SIFT or SURF // Ptr<FeatureDetector> detector = FeatureDetector::create( "SIFT" ); // Ptr<DescriptorExtractor> descriptor_extractor = DescriptorExtractor::create( "SIFT" ); // Ptr<DescriptorMatcher> descriptor_matcher = DescriptorMatcher::create( "BruteForce" ); // if( detector.empty() || descriptor_extractor.empty() ) // throw runtime_error("fail to create detector!"); // // Mat img1 = imread("E:\\DayBreakZcs\\ImageProcessing\\source\\test3.jpg"); // Mat img2 = imread("E:\\DayBreakZcs\\ImageProcessing\\source\\test2.jpg"); // // //detect keypoints; // vector<KeyPoint> keypoints1,keypoints2; // detector->detect( img1, keypoints1 ); // detector->detect( img2, keypoints2 ); // cout <<"img1:"<< keypoints1.size() << " points img2:" <<keypoints2.size() // << " points" << endl << ">" << endl; // // //compute descriptors for keypoints; // cout << "< Computing descriptors for keypoints from images..." << endl; // Mat descriptors1,descriptors2; // descriptor_extractor->compute( img1, keypoints1, descriptors1 ); // descriptor_extractor->compute( img2, keypoints2, descriptors2 ); // // cout<<endl<<"Descriptors Size: "<<descriptors2.size()<<" >"<<endl; // cout<<endl<<"Descriptor's Column: "<<descriptors2.cols<<endl // <<"Descriptor's Row: "<<descriptors2.rows<<endl; // cout << ">" << endl; // // //Draw And Match img1,img2 keypoints // Mat img_keypoints1,img_keypoints2; // drawKeypoints(img1,keypoints1,img_keypoints1,Scalar::all(-1),0); // drawKeypoints(img2,keypoints2,img_keypoints2,Scalar::all(-1),0); // imshow("Box_in_scene keyPoints",img_keypoints1); // imshow("Box keyPoints",img_keypoints2); // // descriptor_extractor->compute( img1, keypoints1, descriptors1 ); // vector<DMatch> matches; // descriptor_matcher->match( descriptors1, descriptors2, matches ); // // Mat img_matches; // drawMatches(img1,keypoints1,img2,keypoints2,matches,img_matches,Scalar::all(-1),CV_RGB(255,255,255),Mat(),4); // // imshow("Mathc",img_matches); // waitKey(0); // return 0; // return 0; Mat image = imread("E:\\DayBreakZcs\\ImageProcessing\\source\\test4.jpg"); Mat descriptors; vector<KeyPoint> keypoints; SimpleBlobDetector::Params params; params.minThreshold = 10; params.maxThreshold = 100; params.thresholdStep = 10; params.minArea = 10; params.minConvexity = 0.3; params.minInertiaRatio = 0.01; params.maxArea = 8000; params.maxConvexity = 10; params.filterByColor = false; params.filterByCircularity = false; SimpleBlobDetector blobDetector( params ); blobDetector.create("SimpleBlob"); blobDetector.detect( image, keypoints ); drawKeypoints(image, keypoints, image, Scalar(255,0,0)); imshow("Mathc",image); waitKey(0); }