我使用此代码将图像转换为矩阵,所以有人知道如何将此矩阵转换为1D - > vector 我希望将图像数据作为一维数组,按行主要顺序排列第一行中的所有像素值,然后列出第二行中的像素值,依此类推。
IplImage *img = cvLoadImage( "lena.jpg", CV_LOAD_IMAGE_COLOR);
CvMat *mat = cvCreateMat(img->height,img->width,CV_32FC3 );
cvConvert( img, mat );
for(int i=0;i<10;i++)
{
for(int j=0;j<10;j++){
CvScalar scal = cvGet2D( mat,j,i);
printf( "(%.f,%.f,%.f) ",scal.val[0], scal.val[1], scal.val[2] );}
printf("\n");}
cvNamedWindow("une_window");
cvShowImage("une_window", img);
cvWaitKey();
cvDestroyWindow("une_window");
答案 0 :(得分:3)
使用C ++ API:
cv::Mat img = cv::imread("a.jpg");
std::vector<uchar> pixels;
pixels.reserve(img.rows * img.cols * 3);
if(img.isContinuous()) {
pixels = std::vector<uchar>(img.ptr(0), img.ptr(0) + img.rows * img.cols * 3 );
}
else {
for(int i = 0; i != img.rows; ++i) {
uchar* p = img.ptr(i);
for(int j = 0; j != img.cols * 3; ++j) {
pixels.push_back(p[j]);
}
}
}
答案 1 :(得分:1)
我认为连续Mats的最快方法是使用reshape命令:
Mat colVec = img.reshape(1, img.rows*img.cols); // change to a Nx3 column vector
reshape命令只更改标题,因此它不需要像素访问,因此在O(1)时间内运行。
答案 2 :(得分:1)
我认为您应该从视频解码器输出中观察到知道视频大小信息,从容器解析器中的元数据收集的其他信息可能不那么准确。
答案 3 :(得分:0)
在C ++中,这实际上是一个单行:
cv::Mat_<float> img = cv::imread("a.jpg", 1);
std::vector<float> dest;
std::copy(img.begin(), img.end(), dest.begin());