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<<"变换矩阵为:
"<<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 

problem with reading image to Mat - OpenCV Q&A Forum 

原文地址:https://www.cnblogs.com/wxl845235800/p/8660448.html