使用OpenCV Create一個1-bit 單通道的tiff影像檔 |
答題得分者是:arisaka_matsuri
|
nat626
一般會員 發表:2 回覆:5 積分:1 註冊:2006-09-19 發送簡訊給我 |
我想使用IplImage來產生一個1-bit 單通道 非0即1的黑白影像
我的程式碼 [code cpp] IplImage *image; CvSize size = cvSize( 320, 240); char array[320*240]; image = cvCreateImageHeader( size, IPL_DEPTH_1U, 1 ); for(int x = 0 ; x < 320*240 ; x ){ array[ x ] = x%2; } cvSetImageData( image, array, image->widthStep ); cvSaceImage( "testImage.tiff", image ); [/code] 但卻得到錯誤訊息 OpenCV ERROR: Input image depth is not supported by function () in function cvGetMat, ../../../cxcore/src/cxarray.cpp(2799) Terminating the application... called from cvUnregisterType, ../../../cxcore/src/cxpersistence.cpp(4933) Terminating the application... called from cvUnregisterType, ../../../cxcore/src/cxpersistence.cpp(4933) Terminating the application... called from cvUnregisterType, ../../../cxcore/src/cxpersistence.cpp(4933) Terminating the application... called from cvUnregisterType, ../../../cxcore/src/cxpersistence.cpp(4933) Terminating the application... called from cvUnregisterType, ../../../cxcore/src/cxpersistence.cpp(4933) Terminating the application... called from cvUnregisterType, ../../../cxcore/src/cxpersistence.cpp(4933) Terminating the application... called from cvUnregisterType, ../../../cxcore/src/cxpersistence.cpp(4933) Terminating the application... called from cvUnregisterType, ../../../cxcore/src/cxpersistence.cpp(4933) Terminating the application... called from cvUnregisterType, ../../../cxcore/src/cxpersistence.cpp(4933) Terminating the application... 但我把image = cvCreateImageHeader( size, IPL_DEPTH_1U, 1 ); 改成image = cvCreateImageHeader( size, IPL_DEPTH_8U, 1 ); 就正常了 :( 但這樣子就是 8-bit 不是我想要的 1-bit 爬文爬一天 找不到問題 請幫助我吧~~~THX
------
貓 |
arisaka_matsuri
高階會員 發表:25 回覆:205 積分:231 註冊:2003-10-19 發送簡訊給我 |
|
nat626
一般會員 發表:2 回覆:5 積分:1 註冊:2006-09-19 發送簡訊給我 |
===================引 用 arisaka_matsuri 文 章=================== 你好 就我所知,OpenCV雖然有IPL_DEPTH_1U的定義 但是沒有任何函式支援這樣的資料型態! 請參考OpenCV的說明文件 其中也有提到IplImage影像支援的格式 並沒有包含IPL_DEPTH_1U 謝謝大大回應 : ) 剛剛看了OpenCV的說明文件 pixel depth in bits : IPL_DEPTH_8U, IPL_DEPTH_8S, IPL_DEPTH_16U, IPL_DEPTH_16S, IPL_DEPTH_32S, IPL_DEPTH_32F, and IPL_DEPTH_64F are supported 那...有別的辦法可以產生出1-bit 單通道的影像檔嗎? 麻煩大大指點一下
------
貓 |
arisaka_matsuri
高階會員 發表:25 回覆:205 積分:231 註冊:2003-10-19 發送簡訊給我 |
你好,
不知道你的應用是在哪方面? 我看了另一個image library,DevIL,也沒支援1-bit影像 如果沒有特殊的應用(節省記憶體、專門的演算法開發等) 其實沒必要用1-bit的方式表示0與1的黑白影像 雖然資料看起來精簡,但一般以像素為單位的影像操作反而不好處理 反之,真的要做也是有辦法的 常見的方式是把8個bit組成一個byte來存放 可以用bit field來實現 e.g. [code cpp] struct PackedPixels { unsigned char pixel0 : 1; unsigned char pixel1 : 1; unsigned char pixel2 : 1; unsigned char pixel3 : 1; unsigned char pixel4 : 1; unsigned char pixel5 : 1; unsigned char pixel6 : 1; unsigned char pixel7 : 1; }; PackedPixels pixels; pixels.pixel0 = 0; pixels.pixel1 = 1; pixels.pixel2 = 0; ... [/code] 這樣就可以單獨存取每一個bit(pixel) 若是需要搭配OpenCV 可以將上述的PackedPixels看成一個byte 就可以用IPL_DEPTH_8U的資料格式存放 |
nat626
一般會員 發表:2 回覆:5 積分:1 註冊:2006-09-19 發送簡訊給我 |
萬分感謝大大回應 : )
我主要的應用只是儲存影像而已 所以並不會對影像做操作 由於是大量的儲存影像 所以用 8-bit 來存,空間會吃很兇 像 320*240 1-bit 的 imageSize 是9600 8-bit 的 imageSize 是 79800 差了 8 倍 O_Q 另外剛剛發現 [code cpp] IplImage *image; CvSize size = cvSize( 320, 240); char array[320*240]; image = cvCreateImageHeader( size, IPL_DEPTH_1U, 1 ); for(int x = 0 ; x < 320*240 ; x ){ array[ x ] = x%2; } cvSetImageData( image, array, image->widthStep ); cvSaceImage( "testImage.tiff", image );[/code] 他是掛在 cvSaceImage( "testImage.tiff", image ); 我一開始以為是掛在image = cvCreateImageHeader( size, IPL_DEPTH_1U, 1 ); 很懊惱...O_Q
------
貓 |
arisaka_matsuri
高階會員 發表:25 回覆:205 積分:231 註冊:2003-10-19 發送簡訊給我 |
你好,
不用懊惱,會掛點是正常的 因為cvSaveImage()的說明有提到: Only 8-bit single-channel or 3-channel (with 'BGR' channel order) images can be saved using this function. 所以,就算能產生色彩深度為1-bit的影像 也沒辦法用 cvSaveImage() 儲存 剛剛找到一個library可以處理1-bit的tiff The Free Image Project http://freeimage.sourceforge.net/ 可以參考看看 |
nat626
一般會員 發表:2 回覆:5 積分:1 註冊:2006-09-19 發送簡訊給我 |
===================引 用 arisaka_matsuri 文 章=================== 你好, 不用懊惱,會掛點是正常的 因為cvSaveImage()的說明有提到: Only 8-bit single-channel or 3-channel (with 'BGR' channel order) images can be saved using this function. 所以,就算能產生色彩深度為1-bit的影像 也沒辦法用 cvSaveImage() 儲存 剛剛找到一個library可以處理1-bit的tiff The Free Image Project http://freeimage.sourceforge.net/ 可以參考看看 謝謝大大的指點!! 我現在正在全力研究Free Image 如果有問題我在上來提問 : )) 在次謝謝 : )))
------
貓 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |