zoukankan      html  css  js  c++  java
  • 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 

  • 相关阅读:
    我爬取了爬虫岗位薪资,分析后发现爬虫真香
    红薯,撑起父亲的快乐,让我揪心
    跨域问题服务端解决办法 Request header field Authorization is not allowed by Access-Control-Allow-Headers
    antdvue2.x 使用阿里iconfont自定义组件iconfont
    前端 crypto-js aes 加解密
    jsencrypt加密解密字符串
    CryptoJS base64使用方法
    客户端js生成rsa 密钥对
    js动态添加style样式
    PHP 使用非对称加密算法(RSA)
  • 原文地址:https://www.cnblogs.com/wxl845235800/p/8660448.html
Copyright © 2011-2022 走看看