Image Watch是在VS2012上使用的一款OpenCV工具,能够实时显示图像和矩阵Mat的内容,跟Matlab很像,方便程序调试,相当好用。
多版本OpenCV:
对于工程中有两个以上OpenCV版本的情况,加入#include
也就是说如果VS中安装了两个以上的OpenCV版本,VS可能会搞混,把include的地址解析到了两个不同OpenCV目录下的头文件,因此引起重定义。
于是在VS中把include目录下的OpenCV2.3.1的头文件地址删除,问题解决。
Image Watch实例:
利用二维SURF特征和单映射寻找已知物体。输入两幅图像,一幅是需要寻找的物体图像,另一幅是场景中包含此物体的图像。
SURF特征的特征描述方法封装在SurfFeatureDetector类中,利用成员函数detect函数检测出SURF特征的关键点,保存在vector容器中,再利用SurfDesciptorExtractor类进行特征向量的计算,将之前的vector变量变成矩阵形式保存在Mat中。
利用FLANN特征匹配算法进行匹配,此算法封装在FlannBaseMatcher类中,匹配后保留好的特征匹配点。利用findHomography获取匹配特征点之间的变换,最后利用perspectiveTransform定位到场景图中物体的4个点。
代码如下:
#include#include #include #include #include #include #include using namespace cv; void usage() { std::cout << "Usage: ./FindObjectByFeature " << std::endl; } int main(int argc, char *argv[]) { if(argc != 3) { usage(); return -1; } Mat img_object = imread(argv[1], CV_LOAD_IMAGE_COLOR); Mat img_scene = imread(argv[2], CV_LOAD_IMAGE_COLOR); if(!img_object.data || !img_scene.data) { std::cout << "Error reading images!" << std::endl; return -1; } //step1:检测SURF特征点///////////////////////////////////////////////////////////////// int minHeassian = 400; SurfFeatureDetector detector(minHeassian); std::vector keypoints_object, keypoints_scene; detector.detect(img_object, keypoints_object); detector.detect(img_scene, keypoints_scene); //step2:计算特征向量/////////////////////////////////////////////////////////////////// SurfDescriptorExtractor extractor; Mat descriptors_object, descriptors_scene; extractor.compute(img_object, keypoints_object, descriptors_object); extractor.compute(img_scene, keypoints_scene, descriptors_scene); //step3:利用FLANN匹配算法匹配特征描述向量////////////////////////////////////////////// FlannBasedMatcher matcher; std::vector matches; matcher.match( descriptors_object, descriptors_scene, matches); double max_dist = 0; double min_dist = 100; //快速计算特征点之间的最大和最小距离/////////////////////////////////////////////////// for(int i = 0; i < descriptors_object.rows; i++) { double dist = matches[i].distance; if(dist < min_dist) min_dist = dist; if(dist > max_dist) max_dist = dist; } printf("---Max dist: %f \n", max_dist); printf("---Min dist: %f \n", min_dist); //只画出好的匹配点(匹配特征点之间距离小于3*min_dist)////////////////////////////////// std::vector good_matches; for(int i = 0; i < descriptors_object.rows; i++) { if(matches[i].distance < 3*min_dist) good_matches.push_back(matches[i]); } Mat img_matches; drawMatches(img_object, keypoints_object, img_scene, keypoints_scene, good_matches, img_matches, Scalar::all(-1), Scalar::all(-1), vector (), DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS); //定位物体//////////////////////////////////////////////////////////////////////////// std::vector obj; std::vector scene; for(int i = 0; i < good_matches.size(); i++) { //从好的匹配中获取特征点///////////////////////////////////// obj.push_back(keypoints_object[good_matches[i].queryIdx].pt); scene.push_back(keypoints_scene[good_matches[i].trainIdx].pt); } //找出匹配特征点之间的变换/////////////////// Mat H = findHomography(obj, scene, CV_RANSAC); //得到image_1的角点(需要寻找的物体)////////// std::vector obj_corners(4); obj_corners[0] = cvPoint(0,0); obj_corners[1] = cvPoint(img_object.cols, 0); obj_corners[2] = cvPoint(img_object.cols, img_object.rows); obj_corners[3] = cvPoint(0, img_object.rows); std::vector scene_corners(4); //匹配四个角点///////////////////////////////////// perspectiveTransform(obj_corners, scene_corners, H); //画出匹配的物体/////////////////////////////////////////////////////////////////////// line(img_matches, scene_corners[0] + Point2f(img_object.cols, 0), scene_corners[1] + Point2f(img_object.cols, 0), Scalar(0,255,0), 4); line(img_matches, scene_corners[1] + Point2f(img_object.cols, 0), scene_corners[2] + Point2f(img_object.cols, 0), Scalar(0,255,0), 4); line(img_matches, scene_corners[2] + Point2f(img_object.cols, 0), scene_corners[3] + Point2f(img_object.cols, 0), Scalar(0,255,0), 4); line(img_matches, scene_corners[3] + Point2f(img_object.cols, 0), scene_corners[0] + Point2f(img_object.cols, 0), Scalar(0,255,0), 4); imshow("Good Matches & Object detection", img_matches); waitKey(0); return 0; }
匹配结果图如下(下图中左边子图为待寻找的物体图像,右边子图场景中寻找到的物体图像):

在Debug模式下,如果我们在程序某处设置调试断点,当程序运行到断点处时,可以在Image Watch窗口(View->Other Windows->Image Watch)查看已经分配内存的Mat图像。





















大小: 8KB
大小: 89.5M
终端仿真器 SecureCRTv7.1.1.264 最新版
串口调试小助手1.3 免费版
WinHex 十六进制编辑器v20.2 SR-5 绿色中文注册版
小旋风ASP服务器安装版
16进制转换工具V1.0 中文绿色版
Adobe AIRV33.1.1.932 官方最新版
github离线安装包64位版V2.9.11官方最新版(github desktop)
MSDN Library Visual Studio 6.0(VC、VB、VF、VJ)中文版win32开发人员必备
版本控制软件(SourceTree)v3.4.6 官方最新版
Memory Analyzer (MAT)V1.01 免费绿色版
Delphi Distillerv1.85绿色版
IBM内存检测工具(IBM Thread and Monitor Dump Analyzer for Java)V4.3.3 绿色版
.NETv3.0 可再发行组件包
一键安装JSP环境安装版
slave4j(基于eclipse插件的java代码生成器)V1.0.0 正式版
Auto DebugProfessional 5.6.5.18 中文绿色版
Understand For C++V1.4.319英文安装版