3

私はこのコードを使用して画像をマトリックスに変換するので、誰かがこのマトリックスを1D配列に変換する方法を知っています->ベクトル画像データを1D配列として、行の主要な順序で、すべてのピクセル値である必要があります最初の行が最初にリストされ、2 行目のピクセル値が続きます。

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

4 に答える 4

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]);
       }
     }   
   }
于 2012-04-27T15:00:09.003 に答える
1

連続マットの最速の方法は、reshapeコマンドを使用することだと思います。

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

reshapeコマンドはヘッダーを変更するだけなので、ピクセルアクセスを必要としないため、O(1)時間で実行されます。

于 2012-07-24T19:34:37.450 に答える
1

ビデオ デコーダーの出力からビデオ サイズ情報を確認する必要があると思いますが、コンテナー パーサーのメタデータから収集されるその他の情報はそれほど正確ではない可能性があります。

于 2012-10-29T08:34:07.210 に答える
0

C++ では、これは実際にはワンライナーです。

cv::Mat_<float> img = cv::imread("a.jpg", 1);
std::vector<float> dest;
std::copy(img.begin(), img.end(), dest.begin());
于 2013-04-22T20:47:26.000 に答える