2015-09-07 59 views
1

我有一個SuperSpeed USB 3.0 Ximea相機,我試圖使用包含計算機視覺和機器學習的Ximea相機編寫應用程序。如何使用Ximea在C++中存儲圖像

我已經能夠分配相機捕獲的幀在它的緩衝區中,但我可以找到方法將這些圖像或幀保存爲JPEG或BMP文件。我不知道這是否只是我的腳本中的命令行,或者我需要某種庫來完成它。

圖像是使用這些命令獲得性:

#define EXPECTED_IMAGES 10 
for (int images=0;images < EXPECTED_IMAGES;images++) 
{ 
    // getting image from camera 
    stat = xiGetImage(xiH, 5000, &image); 
    HandleResult(stat,"xiGetImage"); 
    printf("Image %d (%dx%d) received from camera\n", images, (int)image.width, (int)image.height); 

} 

正如我可以從圖像中提取數據,我想該幀是靜止在緩衝器中,但我不能找出方式將其保存爲電腦中的JPEG或BMP文件。

我將不勝感激代碼的任何幫助。

謝謝!

回答

-1

用於存儲來自XIMEA相機的圖像我建議使用OpenCV庫 ,因爲它提供了用於存儲JPEG和BMP圖像格式的工具。請下載 一個簡短的例子,演示了從相機存儲幾種不同的數據格式 到JPEG和BMP圖像。使用MSVC 2013項目和OpenCV3.0二進制文件從here下載存檔,並使用密碼SHWJGRAIHFLG提取 。

如果您有任何其他有關XIMEA產品的問題,請訪問 並直接在XIMEA customer support上註冊。謝謝。

最好的問候, XIMEA隊

+1

一個不好的答案的完美例子。沒有解釋和斷開的鏈接。 – Binarian

+0

感謝您的注意,下載鏈接已修復,現在應該可以使用。 –

2

啊哈,保存圖像。我想你現在可能已經得到了答案。 但是這裏是我的,我希望這對任何使用機器視覺相機的人都有用。 我一直在使用XIMEA很長一段時間了。 XIMEA API不包含將圖像從緩衝區保存到硬盤的任何功能。所以,你需要編寫自己的函數或使用一些庫來保存圖像。我認爲,基本上這取決於RAW或壓縮圖像以及您想要保存的圖像格式。即。 BMP,JPEG,PNG,PGM,EXR ......

讓我們先做幾個假設吧。

  1. 在這裏,我假設你想要節省8bit每像素RAW圖像的分辨率爲1024 * 1024。圖像的大小將是8位* 1024 * 1024 = 8388608位= 1048576btye〜= 1MB

  2. 通過查看您的代碼,您使用的是C++中的XIMEA API。

好的......下面是我最常用的兩種方法來保存XIMEA中的圖像。

  1. 根據要要保存的格式寫的所有圖像像素爲二進制文件用適當的標題。以下是將數據保存到PGM格式圖像的示例。

    FILE *file; 
    char fileName = "example.pgm"; 
    char *image; 
    int width = 1024; 
    int height = 1024; 
    int byte_per_pixel = 1; 
    int max_pixel_value = 255; 
    file = fopen (fileName , "w+bx"); 
    if(file == NULL){ 
        fprintf(stderr, "Cannot open %s\n", fileName); 
        return -1; 
    } 
    size_t n = 0; 
    n += fprintf(file, "P5\n# Comment goes here!\n%d %d\n%d\n", width, height, max_pixel_value); 
    n += fwrite(image, 1, width * height * byte_per_pixel, file); 
    fclose (fileToSave);

    保存圖像PGM看似容易,但是當你需要保存爲圖像像素深度大於8位高,你需要處理字節排列順序問題,因爲PGM big-endian格式。這裏是一個鏈接到Netpbm格式,如果你想閱讀更多關於它。 https://en.wikipedia.org/wiki/Netpbm_format

    而且,其他格式可能有更復雜的數據結構的方式,那麼你不能只是簡單地放下一個頭。因此,使用圖像庫或OpenCV將會不那麼繁瑣。

  2. 方便的OpenCV imwrite。既然你要處理像素,OpenCV是一個很好的圖書館。 OpenCV是一個功能強大的庫,可幫助您更輕鬆地操作矩陣。它帶有許多有用的東西,例如GPU加速的OpenCV函數。回到主題,imwrite可以將圖像保存爲多種格式。以下是我寫入的將RAW數據保存爲PNG格式的示例。

    string fileName = "example.png"; 
    char *image; 
    int width = 1024; 
    int height = 1024; 
    int byte_per_pixel = 1; 
    int max_pixel_value = 255; 
    cv::Mat img_raw = cv::Mat(height, width, CV_8UC1, image); 
    vector compression_params; 
    compression_params.push_back(CV_IMWRITE_PNG_COMPRESSION); 
    compression_params.push_back(0); 
    cv::imwrite(PNGFileName, img_raw, compression_params);

    imwirte將根據文件擴展名確定要保存的格式。只需幾行代碼。 OpenCV可以毫不費力地爲您保存圖像。這裏是一個鏈接imwirte的OpenCV的文檔,http://docs.opencv.org/2.4/modules/highgui/doc/reading_and_writing_images_and_video.html?highlight=imwrite

我希望我的回答可以幫助你和其他人想知道如何節省出來的圖像。

相關問題