每列opencv的总和

每列opencv的总和,opencv,Opencv,在Matlab中,如果A是矩阵,sum(A)将A的列视为向量,返回每列和的行向量。 总和(图像);如何使用OpenCV实现这一点?对于8位灰度图像,以下内容应该可以实现(我认为)。 扩展到不同的图像类型应该不会太难 int imgStep = image->widthStep; uchar* imageData = (uchar*)image->imageData; uint result[image->width]; memset(result, 0, sizeof(ucha

在Matlab中,如果A是矩阵,sum(A)将A的列视为向量,返回每列和的行向量。
总和(图像);如何使用OpenCV实现这一点?

对于8位灰度图像,以下内容应该可以实现(我认为)。 扩展到不同的图像类型应该不会太难

int imgStep = image->widthStep;
uchar* imageData = (uchar*)image->imageData;
uint result[image->width];
memset(result, 0, sizeof(uchar) * image->width);
for (int col = 0; col < image->width; col++) {
  for (int row = 0; row < image->height; row++) {
    result[col] += imageData[row * imgStep + col];
  }
}

// your desired vector is in result
intimgstep=image->widthStep;
uchar*图像数据=(uchar*)图像->图像数据;
uint结果[图像->宽度];
memset(结果,0,大小(uchar)*图像->宽度);
用于(int col=0;colwidth;col++){
对于(int row=0;rowheight;row++){
结果[col]+=imageData[row*imgStep+col];
}
}
//您想要的向量是结果

使用
cvReduce
对我很有效。例如,如果需要将矩阵的列和存储为行矩阵,可以执行以下操作:

CvMat * MyMat = cvCreateMat(height, width, CV_64FC1);
// Fill in MyMat with some data...

CvMat * ColSum = cvCreateMat(1, MyMat->width, CV_64FC1);
cvReduce(MyMat, ColSum, 0, CV_REDUCE_SUM);

更多信息请参见。

cvSum尊重ROI,因此如果在整个图像上移动1像素宽的窗口,则可以计算每列的总和

<>我的C++有点生锈,所以我不会提供代码示例,虽然上次我使用OpenCVApHARP,但它运行良好。然而,我不确定这种方法有多有效


我的数学能力也越来越差了,但用1的向量乘以矩阵中列中的所有元素,难道不可能求和吗?

三年后编辑:

正确的功能是

将矩阵简化为向量

函数reduce通过处理 矩阵行/列作为一组一维向量,并执行 对向量执行指定操作,直到生成一行/列 获得。例如,该函数可用于计算水平 以及光栅图像的垂直投影。在减少_MAX和 减少_MIN,输出图像的类型应与源图像的类型相同 一个。在REDUCE_SUM和REDUCE_AVG的情况下,输出可能具有 更大的元素位深度,以保持准确性。和多通道 在这两种缩减模式中也支持阵列

旧的: 我使用了ROI方法:将图像高度和宽度的ROI从左向右移动,然后计算平均值

 Mat src = imread(filename, 0);     
 vector<int> graph( src.cols );
 for (int c=0; c<src.cols-1; c++)
 {
     Mat roi = src( Rect( c,0,1,src.rows ) );
     graph[c] = int(mean(roi)[0]);
 }

 Mat mgraph(  260, src.cols+10, CV_8UC3); 
 for (int c=0; c<src.cols-1; c++)
 {
     line( mgraph, Point(c+5,0), Point(c+5,graph[c]), Scalar(255,0,0), 1, CV_AA);    
 }

 imshow("mgraph", mgraph);
 imshow("source", src);
Mat src=imread(文件名,0);
向量图(src.cols);

对于(int C++=0;CI,像这样的解决方案),没有一个标志也能沿着维度获得标准偏差?只有:平均值、最小值、最大值和总和。你可以跳过CalSUM的初始化。
 Mat test;
 cv::resize(src,test,Size( src.cols,1 ));
 Mat mgraph1(  260, src.cols+10, CV_8UC3); 
 for(int c=0; c<test.cols; c++) 
 {
        graph[c] = test.at<uchar>(0,c);
 }
 for (int c=0; c<src.cols-1; c++)
 {
     line( mgraph1, Point(c+5,0), Point(c+5,graph[c]), Scalar(255,255,0), 1, CV_AA);     
 }
 imshow("mgraph1", mgraph1);