opencv-求图像连通区域数的一个代码一直提示vector subscript out of range,求问

问题描述

求图像连通区域数的一个代码一直提示vector subscript out of range,求问

skin是用来提取肤色区域的,不加这段可以正常运行,加了就不行了
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
using namespace cv;

void Two_Pass(const cv::Mat& binImg, cv::Mat& lableImg) //两遍扫描法
{
if (binImg.empty() ||
binImg.type() != CV_8UC1)
{
cout<<"no picture"<<endl;
return;
}

// 第一个通路

lableImg.release();
binImg.convertTo(lableImg, CV_32SC1);

int label = 1;
std::vector labelSet;
labelSet.push_back(0);

labelSet.push_back(1);

int rows = binImg.rows - 1;
int cols = binImg.cols - 1;
for (int i = 1; i < rows; i++)
{
int* data_preRow = lableImg.ptr(i-1);
int* data_curRow = lableImg.ptr(i);
for (int j = 1; j < cols; j++)
{
if (data_curRow[j] == 1)
{
std::vector neighborLabels;
neighborLabels.reserve(2);
int leftPixel = data_curRow[j-1];
int upPixel = data_preRow[j];
if ( leftPixel > 1)
{
neighborLabels.push_back(leftPixel);
}
if (upPixel > 1)
{
neighborLabels.push_back(upPixel);
}

    if (neighborLabels.empty())
    {
      labelSet.push_back(++label);  // 不连通,标签+1
      data_curRow[j] = label;
      labelSet[label] = label;
    }
    else
    {
      std::sort(neighborLabels.begin(), neighborLabels.end());
      int smallestLabel = neighborLabels[0];
      data_curRow[j] = smallestLabel;

      // 保存最小等价表
      for (size_t k = 1; k < neighborLabels.size(); k++)
      {
        int tempLabel = neighborLabels[k];
        int& oldSmallestLabel = labelSet[tempLabel];
        if (oldSmallestLabel > smallestLabel)
        {
          labelSet[oldSmallestLabel] = smallestLabel;
          oldSmallestLabel = smallestLabel;
        }
        else if (oldSmallestLabel < smallestLabel)
        {
          labelSet[smallestLabel] = oldSmallestLabel;
        }
      }
    }
  }
}

}

// 更新等价对列表
// 将最小标号给重复区域
cout<<labelSet.size();
for (size_t i = 2; i < labelSet.size(); i++)
{
int curLabel = labelSet[i];
int preLabel = labelSet[curLabel];
while (preLabel != curLabel)
{
curLabel = preLabel;
preLabel = labelSet[preLabel];
}
labelSet[i] = curLabel;
} ;

for (int i = 0; i < rows; i++)
{
int* data = lableImg.ptr(i);
for (int j = 0; j < cols; j++)
{
int& pixelLabel = data[j];
pixelLabel = labelSet[pixelLabel];

}
}
}
//彩色显示
cv::Scalar GetRandomColor()
{
uchar r = 255 * (rand()/(1.0 + RAND_MAX));
uchar g = 255 * (rand()/(1.0 + RAND_MAX));
uchar b = 255 * (rand()/(1.0 + RAND_MAX));
return cv::Scalar(b,g,r);
}

void LabelColor(const cv::Mat& labelImg, cv::Mat& colorLabelImg)
{
if (labelImg.empty() ||
labelImg.type() != CV_32SC1)
{
return;
}

std::map colors;

int rows = labelImg.rows;
int cols = labelImg.cols;

colorLabelImg.release();
colorLabelImg.create(rows, cols, CV_8UC3);
colorLabelImg = cv::Scalar::all(0);

for (int i = 0; i < rows; i++)
{
const int* data_src = (int*)labelImg.ptr(i);
uchar* data_dst = colorLabelImg.ptr(i);
for (int j = 0; j < cols; j++)
{
int pixelValue = data_src[j];
if (pixelValue > 1)
{
if (colors.count(pixelValue) <= 0)
{
colors[pixelValue] = GetRandomColor();
}

    cv::Scalar color = colors[pixelValue];
    *data_dst++   = color[0];
    *data_dst++ = color[1];
    *data_dst++ = color[2];
  }
  else
  {
    data_dst++;
    data_dst++;
    data_dst++;
  }
}

}
}

Mat skin(Mat &img){
Mat out;

medianBlur( img, out, 15);

  // GaussianBlur(image,out,Size(17,17),0,0);

   //遍历图像得到符合肤色特征的像素点 记录于count

   int count=0;

   for(int i=0;i<out.rows;i++)
  {
      for(int j=0;j<out.cols;j++)
      {
          int r,g,b;   //图像的R,G,B信息
          b=out.at<Vec3b>(i,j)[0];
          g=out.at<Vec3b>(i,j)[1];
          r=out.at<Vec3b>(i,j)[2];
        //  if(i==100&&j==i)cout<<r<<","<<g<<","<<b<<endl;
          double iYIQ,Cr,Cb;   //YIQ,YCbCr颜色空间的I,Cr,Cb值,由转换公式获得
          iYIQ = 0.596*(double)r - 0.275*(double)g - 0.321*(double)b;
          Cb = -0.148*(double)r - 0.291*(double)g + 0.439*(double)b + 128;
          Cr = 0.439*(double)r - 0.368*(double)g - 0.071*(double)b + 128; 

         // if(i==100&&j==i)cout<<iYIQ<<","<<Cb<<","<<Cr<<endl;

          if((iYIQ<=85&&iYIQ>=15)&&(Cb>88&&Cb<133)&&(Cr>122&&Cr<169))count++;
         //if(r>95 && g>40 && b>20 && r>g && r>b && max(r,g,b)-min(r,g,b)>15 && abs(r-g)>15)count++;
          else {out.at<Vec3b>(i,j)[0]=0;out.at<Vec3b>(i,j)[1]=0;out.at<Vec3b>(i,j)[2]=0;}
     }
 }
   return out;

}

int main()
{

cv::Mat binImage = cv::imread("F:3.jpg");
Mat out=skin(binImage);
imshow("xixi",out);
waitKey(0);
Mat out1;
cv::cvtColor(out,out1,CV_BGR2GRAY);
imshow("xixi1",out1);
waitKey(0);
Mat out2;
cv::threshold(out1, out1, 1, 255, CV_THRESH_BINARY_INV);
if(out1.empty()==1)cout<<"no picture!!"<<endl;
imshow("xixi2",out1);
waitKey(0);

cv::Mat labelImg;
Two_Pass(out1, labelImg);
//Seed_Filling(binImage, labelImg);
//彩色显示
cv::Mat colorLabelImg;
LabelColor(labelImg, colorLabelImg);
cv::imshow("colorImg", colorLabelImg);
/* //灰度显示
cv::Mat grayImg;
labelImg *= 10;
labelImg.convertTo(grayImg, CV_8UC1);
cv::imshow("labelImg", grayImg);
*/

cv::waitKey(0);
return 0;
}

解决方案

vector subscript out of range
vector subscript out of range .
vector subscript out of range问题解决方案之一

时间: 2025-01-02 03:12:00

opencv-求图像连通区域数的一个代码一直提示vector subscript out of range,求问的相关文章

求图像任意区域截取源代码,可用漫水填充实现的吗,不胜感激

问题描述 求图像任意区域截取源代码,可用漫水填充实现的吗,不胜感激 做一个程序,可以实现:载入衣服图像,截取任意区域然后显示,最后加一个简单的界面,包括载入图像,重新选取和保存截图,必有重谢 解决方案 要用什么语言实现?qt和opencv都能实现你要的功能 解决方案二: 可以使用opencv这个库实现,具体google下 解决方案三: 在VC或者VS环境下配置opencv,利用opencv里面的库函数很容易实现. 解决方案四: 这个程序很简单,不知道重谢是什么?

c语言-求帮助写一个代码 刚学习数据结构 实在是搞不懂 求大神帮忙谢谢

问题描述 求帮助写一个代码 刚学习数据结构 实在是搞不懂 求大神帮忙谢谢 好心人帮忙翻译好了 求大神帮忙写一下代码 谢谢大家了 解决方案 你的需求,要至少4000C币,你给的100太少了 解决方案二: http://blog.csdn.net/qq_31766907/article/details/50331951这个链接,你看看,或许能帮到你.

控件-下载了一个pb 代码,提示下载成功,但奇怪了,找不到文件

问题描述 下载了一个pb 代码,提示下载成功,但奇怪了,找不到文件 下载了一个pb 代码,提示下载成功,但奇怪了,找不到文件 是rar文件,请问怎么找到下载文件:PB8的日历控件 解决方案 到底去哪了,我也找不到 解决方案二: 到底去哪了,我也找不到 解决方案三: 到底去哪了,我也找不到 解决方案四: 到底去哪了,我也找不到 解决方案五: 到底去哪了,我也找不到 解决方案六: 我也是这样的, 下载一个代码, 提示下载成功, 但是什么都没有啊 默认下载玩文件夹都是没有的 解决方案七: 你是用什么下

图像处理-opencv中怎么可以求得图像中区域轮廓的近似长短轴呢

问题描述 opencv中怎么可以求得图像中区域轮廓的近似长短轴呢 如题 解决方案 http://blog.csdn.net/augusdi/article/details/9000777

RMB 急求GIF降低颜色数和相同区域透明化压缩 DLL或COM组件

问题描述 RMB急求GIF降低颜色数和相同区域透明化压缩(DLL或COM组件)要求:GIF有5桢左右,每桢一张图,要求能实现相同区域透明化:能把256色的GIF压缩为24色或8色的GIF:开发成组件.联系QQ:25729013

利用OpenCV检测图像中的长方形画布或纸张并提取图像内容

原文:利用OpenCV检测图像中的长方形画布或纸张并提取图像内容 基于知乎上的一个答案.问题如下: 也就是在一张照片里,已知有个长方形的物体,但是经过了透视投影,已经不再是规则的长方形,那么如何提取这个图形里的内容呢?这是个很常见的场景,比如在博物馆里看到一幅很喜欢的画,用手机找了下来,可是回家一看歪歪斜斜,脑补原画内容又觉得不对,那么就需要算法辅助来从原图里提取原来的内容了.不妨把应用的场景分为以下: 纸张四角的坐标(图中红点)已知的情况 也就是上面的左图中4个红点是可以准确获取,比如手动标注

求C语言高手解惑,一个关于const变量定义数组大小问题

问题描述 求C语言高手解惑,一个关于const变量定义数组大小问题 我在函数的外部定义了一个BlockSize,然后又定义了一个结构(两者都是在函数外部).编译的时候,出现一个error.提示说:variably modified 'array' at file scope const int BlockSize = 20;//define BlockSize 20typedef struct _node { int array[BlockSize]; struct _node* next;}N

ava 自守数-关于自守数,一个测试用例通不过

问题描述 关于自守数,一个测试用例通不过 自守数 如果某个数的平方的末尾几位数等于这个数,那么就称这个数为自守数. 显然,5和6是一位自守数(5x5=25 6x6=36),25x25=625 76x76=5776,所以25和76是两位自守数. 详细描述: 接口说明 原型: Public static boolean isAutoMorphicNum( int num) 输入参数: num 需要判断的数 输出参数(指针指向的内存区域保证有效): 无 返回值: true 是自守数 false 不是自

求给定值的数的所有组合

问题描述 求给定值的数的所有组合 写一个函数,给定参数 x 指定一个数字 参数sum 指定和 要求: 1.求出和为sum的所有的可能的组合,以任意格式输出都可以 2.后一位不能大于前一位数(小于等于) 3.每一位大于0 eg: x为5 sum为17 那么 可能的结果有 5,5,5,2; 5,5,4,3; 5,5,3,3,1; 5,4,4,4; -- 4,4,4,4,1 -- 2,2,2,2,2,2,2,2,1 -- 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 等 解决方案