Mat operation

I have vector ay[4] , then I get the mean of vector. So, I change the vector to matrix. like this

Mat total,rata;
total =  Mat(ay[1]) + Mat(ay[2]) + Mat(ay[3]);
rata = total/3;
cout <<"Total"<< total << endl;
cout <<"Rata"<< rata << endl;


Then, I use the mean of matrix for get the deviation, this is the code.

Mat dev[4], chg[4];
for (int abc=0; abc<4; abc++){
chg[abc] = Mat(ay[abc]);
}
for(int s=0; s<4;s++){
cv::subtract(chg[s],rata,dev[s]);
}
cout << "Data" << dev[1] << endl;


when, I operation this code. the program was break. and this is the error

OpenCV Error: Sizes of input arguments do not match (The operation is neither 'array op array' (where arrays have the same size and the same number of channels), nor 'array op scalar', nor 'scalar op array') in cv::arithm_op, file ........\opencv\modules\core\src\arithm.cpp, line 1287

I dont know why, but that are have the same initialization. Thanks.

edit retag close merge delete

Sort by » oldest newest most voted

Whatever you're trying to do this is a terrible way to do it. You're trying to get the mean and standard deviation for each element of a vector, I think?

The technical problem is that rata is not a number, or a Mat the same size as chg[s]. Basically, subtract can remove a single number from every element of the matrix (pass in a double for 1 channel or a Scalar for multiple channels). It can also subtract one matrix from the other, but they must be the same size and number of channels.

The smarter way to do this is this

Mat allVec(ay[0].size(), 4, CV_32F);//Or whatever code matches the type of the vectors.
for(int abc = 0; abc<4; abc++)
Mat(ay[abc]).copyTo(allVec.col(0));

for(int size = 0; size<ay[0].size(); size++)
{
Scalar mean, stdDev;
meanStdDev(allVec.row(size), mean, stdDev);
std::cout<<"Element 1 Mean = "<<mean(0)<<" StdDev = "<<stdDev(0)<<endl;
}

more