2011-08-01 63 views
5

我想將數據直接寫入IplImage的imageData數組中,但我無法找到有關格式化的大量信息。特別讓我困擾的是,儘管用三個通道創建了一個圖像,但每個像素都有四個字節。寫入IplImage imageData

功能我用創造的形象是:

IplImage *frame = cvCreateImage(cvSize(1, 1), IPL_DEPTH_8U, 3); 

所有跡象表明,這應該創建一個三個通道RGB圖像,但似乎並不如此。

例如,我會如何將單個紅色像素寫入該圖像?

感謝您的任何幫助,它讓我難倒了。

+0

http://stackoverflow.com/questions/6868723/get -ggb-pixels-from-input-image-and-reconstruct -a-output-image-in-opencv/6875991#6875991 – karlphillip

+0

這個答案假定實際上每個像素會有三個比特。我已經確認我的圖像的nChannels是3,但每個像素仍然有4位。對於它的價值,它們實際上並未與像素分組。它們似乎被存儲在每一行的末尾,全部設置爲0. – wyatt

回答

8

如果您正在查看frame->imageSize請記住它是frame->height * frame->widthStep而不是frame->height * frame->width

BGR是OpenCV的原生格式,而不是RGB。另外,如果你剛剛開始,你應該考慮使用C++接口(Mat替換IplImage),因爲這是未來的方向,並且使用起來更容易。

下面是直接訪問像素數據的一些示例代碼:

int main (int argc, const char * argv[]) { 

    IplImage *frame = cvCreateImage(cvSize(41, 41), IPL_DEPTH_8U, 3); 

    for(int y=0; y<frame->height; y++) { 
     uchar* ptr = (uchar*) (frame->imageData + y * frame->widthStep); 
     for(int x=0; x<frame->width; x++) { 
      ptr[3*x+2] = 255; //Set red to max (BGR format) 
     } 
    } 

    cvNamedWindow("window", CV_WINDOW_AUTOSIZE); 
    cvShowImage("window", frame); 
    cvWaitKey(0); 
    cvReleaseImage(&frame); 
    cvDestroyWindow("window"); 
    return 0; 
} 
+0

謝謝你。我終於發現了這一點,被一個不幸的事實蒙上了一層陰影:對於測試中使用的一行和兩行像素行,行舍入分別增加了一個和兩個像素。我會看看墊子,在瀏覽它似乎是一個更不透明的系統,但我想這只是一個熟悉程度不足。 – wyatt

+0

我不是OpenCV的世界權威,但我沒有看到Mat比IplImage更不透明。而且,像運算符重載這樣的C++鈴聲和哨聲更容易處理。該文檔位於http://opencv.itseez.com/modules/core/doc/basic_structures.html#mat – SSteve

0

unsigned char * imageData = [r1,g1,b1,r2,g2,b2,...,rN,bn,gn]; // n =高度*圖像寬度 frame-> imageData = imageData。

將您的圖像作爲高度爲N和寬度爲M的二維數組,並將其排列爲長度爲N * M的行向量向量。爲IPL_DEPTH_8U圖像創建這種類型的無符號字符*。

+1

問題在於每個像素有四個字節。額外的字節似乎分組在每行的末尾,並且都設置爲零,但我不知道爲什麼。另外,我不知道它是否有意義,但圖像似乎存儲在BGR中,而不是RGB。 – wyatt

+1

不知道多餘的4個字節?你怎麼看?嘗試將imagedata分配給char *數組。那對我有用。是的,一些C++庫使用BGR,一些使用RGB。如果在顯示時顏色層看起來被切換,則使用cvCvtColor(frame,frame,CV_BRG2RGB)切換R和B層。 – rossb83

+0

圖像大小始終等於4 *像素數。我只是通過打印imageData數組來找出數據存儲的位置。無論如何,我會嘗試。 – wyatt

0

直接到你的答案,畫像素的紅色:

IplImage *frame = cvCreateImage(cvSize(1, 1), IPL_DEPTH_8U, 3); 
int y,x; 
x=0;y=0; //Pixel coordinates. Use this for bigger images than a single pixel. 
int C=2; //0 for blue, 1 for green and 2 for red (BGR is the default format). 
frame->imageData[y*frame->widthStep+3*x+C]=(uchar)255;