【问题标题】:why this program is crashing为什么这个程序崩溃
【发布时间】:2013-08-05 09:42:22
【问题描述】:

我写了一个小程序,我想根据一个向量将一帧的值设置为255:

result =    cv::Mat::zeros(frame.size(),CV_8UC1);
std::vector<cv::Point2f> imageCorners;
.......................................................
    for ( int i = 0 ; imageCorners.size();i++){
                std::cout << imageCorners[i]<< std::endl;
                result.at<uchar>(imageCorners[i]) = 255;
                cv::imshow("result",result);
            }

我的问题是:为什么程序在完成循环后就崩溃了?即使我看到结果是正确的?我得到的错误信息是:

vector subscript out of range 

【问题讨论】:

    标签: c++ opencv vector


    【解决方案1】:
    for ( int i = 0 ; imageCorners.size();i++){
    //                ^^^^^^^^^^^^^^^^^^^
    

    下划线部分是条件。在这种情况下,您说的是“继续循环直到imageCorners 的大小为“假”(即0)”。但是你永远不会改变向量的大小,所以这个条件永远不会停止循环,i 会不断变大,直到你尝试访问实际上不在imageCorners 中的索引。

    大概你的意思是循环直到i 变得比向量大。然后使用

    for (int i=0; i < imageCorners.size(); ++i) {
    

    【讨论】:

      【解决方案2】:

      这对我来说看起来很狡猾:

       for ( int i = 0 ; imageCorners.size();i++){
      

      你肯定想写这样的东西:

       for ( int i = 0 ; i < imageCorners.size();i++){
      

      【讨论】:

        【解决方案3】:

        循环条件imageCorners.size() 仅产生存储在容器中的元素数量。只要您将一个元素放入imageCorners,该语句将始终评估为true。你要的是i &lt; imageCorners.size()。

        【讨论】:

          【解决方案4】:
          for ( int i = 0 ; imageCorners.size();i++)
          

          如果 imageCorners.size() 不为 0,我认为这个循环将永远运行。所以当这个

          std::cout << imageCorners[i]<< std::endl;
          

          被执行,在某些时候i 会越界,程序会崩溃。

          【讨论】:

            猜你喜欢
            • 2017-04-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-02-04
            • 2014-12-11
            • 2014-06-06
            相关资源
            最近更新 更多