cout显示Mat类对象报错Access Violation
AV(Access Violation)错误:非法访问。
image_match.exe 中的 0x0000002a 处有未经处理的异常: 0xC0000005: Access violation
程序完全完全拷贝,在别人电脑上可以运行,在自己电脑上则不行!考虑是环境配置问题。
cout无法显示Mat类,狂跳exceptional,大概是你想用VS2012的<<操作符,但是dll的ostream operator<<其实是用的vs2010的<<,结果两者冲突了。所以导致exceptional的出现。
原因:使用的opencv版本太乱了,之前的没卸载干净
处理办法:进系统变量和用户变量中删除其他版本的path值。
如果当初有用过vs2012,在里面设置过vc11下的lib,后来又把平台换成VS2010,设置了VC10的路径而忘记删除VC11,这次请把以前vc11的路径删掉,只保留VC10。【参考而已,适当删除!】
#include "opencv2/core/core.hpp" #include "highgui.h" #include "opencv2/imgproc/imgproc.hpp" #include "opencv2/features2d/features2d.hpp" #include "opencv2/nonfree/nonfree.hpp" #include "opencv2/legacy/legacy.hpp" using namespace cv; using namespace std; int main(int argc, char** argv) { //待匹配的两幅图像,其中img1包括img2,也就是要从img1中识别出img2 Mat img1 = imread("book_in_scene.png"); Mat img2 = imread("book.png"); Mat image01; Mat image02; cvtColor(img1,image01,CV_RGB2GRAY); cvtColor(img2,image02,CV_RGB2GRAY); SIFT sift1, sift2; vector<KeyPoint> key_points1, key_points2; Mat descriptors1, descriptors2, mascara; sift1(img1,mascara,key_points1,descriptors1); sift2(img2,mascara,key_points2,descriptors2); //实例化暴力匹配器——BruteForceMatcher BruteForceMatcher<L2<float>> matcher; //定义匹配器算子 vector<DMatch>matches; //实现描述符之间的匹配,得到算子matches matcher.match(descriptors1,descriptors2,matches); //提取出前3个最佳匹配结果 nth_element(matches.begin(), //匹配器算子的初始位置 matches.begin()+9, // 排序的数量 matches.end()); // 结束位置 //剔除掉其余的匹配结果 matches.erase(matches.begin()+10, matches.end()); namedWindow("SIFT_matches"); Mat img_matches; //在输出图像中绘制匹配结果 drawMatches(img1,key_points1, //第一幅图像和它的特征点 img2,key_points2, //第二幅图像和它的特征点 matches, //匹配器算子 img_matches, //匹配输出图像 Scalar(255,255,255)); //用白色直线连接两幅图像中的特征点 imshow("SIFT_matches",img_matches); vector<Point2f> imagePoints1,imagePoints2; for(int i=0;i<10;i++) { imagePoints1.push_back(key_points1[matches[i].queryIdx].pt); imagePoints2.push_back(key_points2[matches[i].trainIdx].pt); } Mat homo=findHomography(imagePoints1,imagePoints2,CV_RANSAC); ////也可以使用getPerspectiveTransform方法获得透视变换矩阵,不过要求只能有4个点,效果稍差 //Mat homo=getPerspectiveTransform(imagePoints1,imagePoints2); cout<<"变换矩阵为:\n"<<homo<<endl<<endl;//输出映射矩阵 //图像配准 Mat imageTransform1,imageTransform2; warpPerspective(image01,imageTransform1,homo,Size(image02.cols,image02.rows)); imshow("经过透视矩阵变换后",imageTransform1); waitKey(0); return 0; }
以上是图像特征匹配代码。
科学网—【opencv】cout显示Mat类对象会跳出exceptional的解决方法 - 邓若曦的博文 http://blog.sciencenet.cn/blog-972981-712339.html
c++ - opencv: using cout with Mat object throwing exception - Stack Overflow
ζั͡ޓއ genji - 至此只为原地流浪.......