find object

#include  " stdafx.h "
#include  " cv.h "
#include  " highgui.h "

using  namespace cv;

int _tmain( int argc, _TCHAR* argv[])
{
     // const cv::Mat object = cv::imread("lenaface.JPG", 0);  // Load as grayscale
    
// const cv::Mat image = cv::imread("lena.jpg", 0);
     const cv::Mat  object = cv::imread( " box.png "0);  // Load as grayscale
     const cv::Mat image = cv::imread( " box_in_scene.png "0);
     // 1.detect keypoints of object and image using SIFT
    cv::SiftFeatureDetector *detector;
    detector =  new SiftFeatureDetector( 0.04/ 5/ 2.0, 0.5);
     // SurfFeatureDetector detector;
    std::vector<cv::KeyPoint> objectKeypoints;
    std::vector<cv::KeyPoint> imageKeypoints;
    detector->detect( object, objectKeypoints);
     // show
    
// cv::Mat output_object;
    
// cv::drawKeypoints(object, objectKeypoints, output_object);
     /// /cv::imwrite("output_object.jpg", output_object);
     // cv::namedWindow("object", CV_WINDOW_AUTOSIZE);
    
// cv::imshow("object", output_object);
    
//
    detector->detect(image,imageKeypoints);
     // show
    
// cv::Mat output_image;
    
// cv::drawKeypoints(image, imageKeypoints, output_image);
     /// /cv::imwrite("output_image.jpg", output_image);
     // cv::namedWindow("image", CV_WINDOW_AUTOSIZE);
    
// cv::imshow("image", output_image);

    
// 2.get Descriptors
    Mat objectDescriptor,imageDescriptor;
    cv::SiftDescriptorExtractor descriptorExtractor;
     // cv::SurfDescriptorExtractor descriptorExtractor;
    descriptorExtractor.compute( object,  objectKeypoints, objectDescriptor);
    descriptorExtractor.compute(image , imageKeypoints, imageDescriptor );

     // 3.
    
//  Match descriptors of 2 images (find pairs of corresponding points)
    BruteForceMatcher<L2< float>> matcher; //  Use FlannBasedMatcher matcher. It is better
    vector<DMatch> matches;
    matcher.match(objectDescriptor, imageDescriptor, matches);


     //  Extract pairs of points
    vector< int> pairOfsrcKP(matches.size()), pairOfdstKP(matches.size());
     for( size_t i =  0; i < matches.size(); i++ ){
        pairOfsrcKP[i] = matches[i].queryIdx;
        pairOfdstKP[i] = matches[i].trainIdx;
    }

    vector<Point2f> sPoints; KeyPoint::convert(objectKeypoints, sPoints,pairOfsrcKP);
    vector<Point2f> dPoints; KeyPoint::convert(imageKeypoints, dPoints,pairOfdstKP);

     //  Matched pairs of 2D points. Those pairs will be used to calculate homography
    Mat src2Dfeatures;
    Mat dst2Dfeatures;
    Mat(sPoints).copyTo(src2Dfeatures);
    Mat(dPoints).copyTo(dst2Dfeatures);

     //  Calculate homography
    vector<uchar> outlierMask;
    
        double h[ 9];
     // CvMat H = cvMat(3, 3, CV_64F, h);
    Mat H;
    H = findHomography( src2Dfeatures, dst2Dfeatures, outlierMask, RANSAC,  3);
    Mat outimg;
    drawMatches( object, objectKeypoints,image, imageKeypoints, matches, outimg, Scalar::all(- 1), Scalar::all(- 1),
        reinterpret_cast< const vector< char>&> (outlierMask));
     // imshow("Matches: Src image (left) to dst (right)", outimg);

    
//

    CvPoint src_corners[ 4] = {{ 0, 0}, { object.cols, 0}, { object.cols,  object.rows}, { 0object.rows}};
    CvPoint dst_corners[ 4];

     int k =  0;
     for( int i =  0; i < H.rows; i++)
     for( int j =  0; j < H.cols; j++)
        h[k++]= H.at< double>(i,j);

     forint i =  0; i <  4; i++ )
    {
         double x = src_corners[i].x, y = src_corners[i].y;
         double Z =  1./(h[ 6]*x + h[ 7]*y + h[ 8]);
         double X = (h[ 0]*x + h[ 1]*y + h[ 2])*Z;
         double Y = (h[ 3]*x + h[ 4]*y + h[ 5])*Z;
        dst_corners[i] = cvPoint(cvRound(X), cvRound(Y));
    }
    Mat lineBox(outimg);
     forint i =  0; i <  4; i++ )
    {
        CvPoint r1 = dst_corners[i% 4];
        CvPoint r2 = dst_corners[(i+ 1)% 4];
        line( lineBox, cvPoint(r1.x+ object.cols, r1.y ), cvPoint(r2.x+ object.cols , r2.y), Scalar( 0, 125, 255),  3, CV_AA);
    }
    imshow( " Matches: Src image (left) to dst (right) ", lineBox);
    waitKey();
}

转载于:https://www.cnblogs.com/smartvessel/archive/2011/10/23/2222079.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
FindObject是一个ROS(机器人操作系统)中的节点,用于在图像中查找特定的物体。它可以通过启动find_object_3d节点来使用。\[1\]在启动节点之后,可以使用不同的launch文件来适配不同的相机,例如find_object_3d_kinect2.launch或find_object_3d_zed.launch。\[1\]FindObject是一个模板化的StaticFindObject,它接受一些输入参数来指定要查找的物体。其中,Outer参数用于指定资源对象所在的包,Name参数用于指定物体的唯一标识,ExactClass参数用于指定是否要确切匹配物体的类别。\[2\]此外,还有一些常用的函数和方法,如FindObjectFast、FindObjectChecked、FindObjectSafe和FSoftObjectPath::ResolveObject,它们之间有一定的调用关系。\[3\] #### 引用[.reference_title] - *1* [通过ROS控制真实机械臂(16) --- 视觉抓取之find_object实现物体识别](https://blog.csdn.net/qq_34935373/article/details/103757619)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [[UE C++] 资源加载(二) 查找资源——FindObject](https://blog.csdn.net/qq_52179126/article/details/130114399)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值