2012-04-27 107 views
2

我使用此代碼將圖像轉換爲矩陣,所以有人有任何想法如何將此矩陣轉換爲1D一個 - >向量 我想有圖像數據作爲一維數組,行中主要順序是首先列出第一行中的所有像素值,然後是第二行中的像素值,依此類推。快速像素訪問opencv

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"); 

回答

2

使用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]); 
     } 
    } 
    } 
+0

@Butterflay指示一個連接錯誤。起初你應該設置你的環境,以便編譯一個最小的C++ opencv程序。 – inf 2012-04-27 17:09:45

+0

其實這是一個單線! std :: copy(img.begin(),img.end(),vector.begin()); – ypnos 2013-04-22 20:45:42

1

相信對於連續墊最快的方法是使用重塑命令:

Mat colVec = img.reshape(1, img.rows*img.cols); // change to a Nx3 column vector 

的整形命令只是更改了標題,所以它不需要像素訪問,因此在O(1)時間內運行。

1

我認爲你應該從視頻解碼器輸出來觀察視頻大小信息,從容器解析器中的元數據收集的其他信息可能不是那麼準確。

0

在C++中,這實際上是一個班輪:

cv::Mat_<float> img = cv::imread("a.jpg", 1); 
std::vector<float> dest; 
std::copy(img.begin(), img.end(), dest.begin());