i want to Convert Mat to vector and Vector to mat in opencv .
我想把Mat转换成矢量和矢量在opencv中的垫子。
my code :
我的代码:
void mat_to_vector(Mat in,vector<float> &out){
for (int i=0; i < in.rows; i++) {
for (int j =0; j < in.cols; j++){
//unsigned char temp;
//file << Dst.at<float>(i,j) << endl;
out.push_back(in.at<float>(i,j));
}
}
}
void vector_to_mat(vector<float> in, Mat out,int cols , int rows){
for (int i=rows-1; i >=0; i--) {
for (int j =cols -1; j >=0; j--){
out.at<float>(i,j) = in.back();
in.pop_back();
//file << Dst.at<float>(i,j) << endl;
// dst_temp.push_back(Dst.at<float>(i,j));
}
}
}
Above codes are slow. are there faster solutions?
以上代码是缓慢的。有更快的解决方案吗?
2 个解决方案
#1
6
I think my code will be useful for you:
我想我的代码对你有用:
// Generate some test data
int r=3;
int c=3;
Mat M(r,c,CV_32FC1);
for(int i=0;i<r*c;++i)
{
M.at<float>(i)=i;
}
// print out matrix
cout << M << endl;
// Create vector from matrix data (data with data copying)
vector<float> V;
V.assign((float*)M.datastart, (float*)M.dataend);
// print out vector
cout << "Vector" << endl;
for(int i=0;i<r*c;++i)
{
cout << V[i] << endl;
}
// Create matrix from vector
// Without copying data (only pointer assigned)
//Mat M2=Mat(r,c,CV_32FC1,(float*)V.data());
// With copying data
Mat M2=Mat(r,c,CV_32FC1);
memcpy(M2.data,V.data(),V.size()*sizeof(float));
// Print out matrix created from vector
cout << "Second matrix" << endl;
cout << M2 <<endl;
// wait for a key
getchar();
#2
1
This is how I do it. The first function is inspired by https://*.com/a/26685567 . The output of VectorToMat is in CV _8U.
我就是这么做的。第一个函数的灵感来自https://*.com/a/26685567。VectorToMat的输出在CV _8U中。
void MatToVector(const Mat& in, vector<float>& out)
// Convert a 1-channel Mat<float> object to a vector.
{
if (in.isContinuous()) { out.assign((float*)in.datastart, (float*)in.dataend); }
else {
for (int i = 0; i < in.rows; ++i)
{ out.insert(out.end(), in.ptr<float>(i), in.ptr<float>(i) + in.cols); }
} return;
}
void VectorToMat(const vector<float>& in, Mat& out)
{
vector<float>::const_iterator it = in.begin();
MatIterator_<uchar> jt, end;
jt = out.begin<uchar>();
for (; it != in.end(); ++it) { *jt++ = (uchar)(*it * 255); }
}
#1
6
I think my code will be useful for you:
我想我的代码对你有用:
// Generate some test data
int r=3;
int c=3;
Mat M(r,c,CV_32FC1);
for(int i=0;i<r*c;++i)
{
M.at<float>(i)=i;
}
// print out matrix
cout << M << endl;
// Create vector from matrix data (data with data copying)
vector<float> V;
V.assign((float*)M.datastart, (float*)M.dataend);
// print out vector
cout << "Vector" << endl;
for(int i=0;i<r*c;++i)
{
cout << V[i] << endl;
}
// Create matrix from vector
// Without copying data (only pointer assigned)
//Mat M2=Mat(r,c,CV_32FC1,(float*)V.data());
// With copying data
Mat M2=Mat(r,c,CV_32FC1);
memcpy(M2.data,V.data(),V.size()*sizeof(float));
// Print out matrix created from vector
cout << "Second matrix" << endl;
cout << M2 <<endl;
// wait for a key
getchar();
#2
1
This is how I do it. The first function is inspired by https://*.com/a/26685567 . The output of VectorToMat is in CV _8U.
我就是这么做的。第一个函数的灵感来自https://*.com/a/26685567。VectorToMat的输出在CV _8U中。
void MatToVector(const Mat& in, vector<float>& out)
// Convert a 1-channel Mat<float> object to a vector.
{
if (in.isContinuous()) { out.assign((float*)in.datastart, (float*)in.dataend); }
else {
for (int i = 0; i < in.rows; ++i)
{ out.insert(out.end(), in.ptr<float>(i), in.ptr<float>(i) + in.cols); }
} return;
}
void VectorToMat(const vector<float>& in, Mat& out)
{
vector<float>::const_iterator it = in.begin();
MatIterator_<uchar> jt, end;
jt = out.begin<uchar>();
for (; it != in.end(); ++it) { *jt++ = (uchar)(*it * 255); }
}