Basler相機windows Opencv開發2
上一個部落格講到如何安裝pylon以及他們的一些例程,這一章講如何用opencv開啟basler的gige相機。
雖然用常規的方法開啟工業相機是沒有問題的,但是這種方法不好設定相機的引數。
1. 新建一個控制檯程式的工程,設定屬性管理器。
新增i包含目錄
C:\Program Files\Basler\pylon 5\Development\include\pylon
C:\Program Files\Basler\pylon 5\Development\include
和庫目錄
C:\Program Files\Basler\pylon 5\Development\lib\x64
如果安裝目錄不同,讀者根據自己的電腦安裝路徑修改這兩個目錄。
2.配置opencv
3.程式碼
我用到的最重要的幾個引數是 影象的長寬,offset,曝光時間。讀者可根據自己的相機和需要設定這幾個引數
int64_t newWidth = 1626;
int64_t newHeight = 196;
int64_t exposuretime = 1000;
int64_t Yoffset=450;
函式
extern bool imageProcessmain(Mat &frame);
是影象處理函式,內容寫在其他cpp檔案裡。如果返回值是0則下面的主函式的死迴圈會退出。返回值為1時會繼續獲取新的影象。
// Grab.cpp /* Note: Before getting started, Basler recommends reading the Programmer's Guide topic in the pylon C++ API documentation that gets installed with pylon. If you are upgrading to a higher major version of pylon, Basler also strongly recommends reading the Migration topic in the pylon C++ API documentation. This sample illustrates how to grab and process images using the CInstantCamera class. The images are grabbed and processed asynchronously, i.e., while the application is processing a buffer, the acquisition of the next buffer is done in parallel. The CInstantCamera class uses a pool of buffers to retrieve image data from the camera device. Once a buffer is filled and ready, the buffer can be retrieved from the camera object for processing. The buffer and additional image data are collected in a grab result. The grab result is held by a smart pointer after retrieval. The buffer is automatically reused when explicitly released or when the smart pointer object is destroyed. */ // Include files to use the PYLON API. #include <pylon/PylonIncludes.h> #ifdef PYLON_WIN_BUILD # include <pylon/PylonGUI.h> #endif #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv.hpp> #include <opencv2/highgui/highgui.hpp> #include "opencv2/objdetect/objdetect.hpp" #include <opencv2/imgproc/imgproc.hpp> #include <highgui.h> #define USE_GIGE 1 using namespace Pylon; using namespace GenApi; using namespace cv; using namespace std; //////////////通過修改這部分來改變延時//開始和停止抓取會影響幀率 static const uint32_t c_countOfImagesToGrab = 10000; uint32_t c_count = c_countOfImagesToGrab; ///////////////// ////////////////重要引數設定 int64_t newWidth = 1626; int64_t newHeight = 196; int64_t exposuretime = 1000; int64_t Yoffset=450; /////////////// #include <pylon/PylonIncludes.h> // Namespace for using pylon objects. using namespace Pylon; #if defined( USE_1394 ) // Setting for using Basler IEEE 1394 cameras. #include <pylon/1394/Basler1394InstantCamera.h> typedef Pylon::CBasler1394InstantCamera Camera_t; using namespace Basler_IIDC1394CameraParams; #elif defined ( USE_GIGE ) // Setting for using Basler GigE cameras. #include <pylon/gige/BaslerGigEInstantCamera.h> typedef Pylon::CBaslerGigEInstantCamera Camera_t; using namespace Basler_GigECameraParams; #elif defined ( USE_CAMERALINK ) // Setting for using Basler Camera Link cameras. #include <pylon/cameralink/BaslerCameraLinkInstantCamera.h> typedef Pylon::CBaslerCameraLinkInstantCamera Camera_t; using namespace Basler_CLCameraParams; #elif defined ( USE_USB ) // Setting for using Basler USB cameras. #include <pylon/usb/BaslerUsbInstantCamera.h> typedef Pylon::CBaslerUsbInstantCamera Camera_t; using namespace Basler_UsbCameraParams; #else #error Camera type is not specified. For example, define USE_GIGE for using GigE cameras. #endif ////////////// //////////////// int64_t Adjust(int64_t val, int64_t minimum, int64_t maximum, int64_t inc) { // Check the input parameters. if (inc <= 0) { // Negative increments are invalid. throw LOGICAL_ERROR_EXCEPTION("Unexpected increment %d", inc); } if (minimum > maximum) { // Minimum must not be bigger than or equal to the maximum. throw LOGICAL_ERROR_EXCEPTION("minimum bigger than maximum."); } // Check the lower bound. if (val < minimum) { return minimum; } // Check the upper bound. if (val > maximum) { return maximum; } // Check the increment. if (inc == 1) { // Special case: all values are valid. return val; } else { // The value must be min + (n * inc). // Due to the integer division, the value will be rounded down. return minimum + (((val - minimum) / inc) * inc); } } extern bool imageProcessmain(Mat &frame); /////////////// int main(int argc, char* argv[]) { cv::CommandLineParser parser(argc, argv, "{h||}" "{w||}" "{t||}" "{o||}" ); if (parser.has("h")) { newHeight=parser.get<double>("h"); } if (parser.has("w")) { newWidth = parser.get<double>("w"); } if (parser.has("t")) { exposuretime = parser.get<double>("t"); } if (parser.has("o")) { Yoffset = parser.get<double>("o"); } // The exit code of the sample application. int exitCode = 0; // Before using any pylon methods, the pylon runtime must be initialized. PylonInitialize(); try { // Create an instant camera object with the camera device found first. // CInstantCamera camera(CTlFactory::GetInstance().CreateFirstDevice()); /////////// CDeviceInfo info; info.SetDeviceClass(Camera_t::DeviceClass()); // Create an instant camera object with the first found camera device matching the specified device class. Camera_t camera(CTlFactory::GetInstance().CreateFirstDevice(info)); // Print the model name of the camera. cout << "Using device " << camera.GetDeviceInfo().GetModelName() << endl; // Open the camera. camera.Open(); /////////// // Print the model name of the camera. cout << "Using device " << camera.GetDeviceInfo().GetModelName() << endl; ///////////////////// camera.PixelFormat.SetValue(PixelFormat_Mono8); //////////////////// // Some properties have restrictions. Use GetInc/GetMin/GetMax to make sure you set a valid value. newWidth = Adjust(newWidth, camera.Width.GetMin(), camera.Width.GetMax(), camera.Width.GetInc()); newHeight = Adjust(newHeight, camera.Height.GetMin(), camera.Height.GetMax(), camera.Height.GetInc()); camera.Width.SetValue(newWidth); camera.Height.SetValue(newHeight); if (IsWritable(camera.OffsetX)) { camera.OffsetX.SetValue(camera.OffsetX.GetMin()); } if (IsWritable(camera.OffsetY)) { camera.OffsetY.SetValue(Yoffset); } cout << "OffsetX : " << camera.OffsetX.GetValue() << endl; cout << "OffsetY : " << camera.OffsetY.GetValue() << endl; cout << "Width : " << camera.Width.GetValue() << endl; cout << "Height : " << camera.Height.GetValue() << endl; //////////////////// //Disable acquisition start trigger if available { GenApi::IEnumEntry* acquisitionStart = camera.TriggerSelector.GetEntry(TriggerSelector_AcquisitionStart); if (acquisitionStart && GenApi::IsAvailable(acquisitionStart)) { camera.TriggerSelector.SetValue(TriggerSelector_AcquisitionStart); camera.TriggerMode.SetValue(TriggerMode_Off); } } //Disable frame start trigger if available { GenApi::IEnumEntry* frameStart = camera.TriggerSelector.GetEntry(TriggerSelector_FrameStart); if (frameStart && GenApi::IsAvailable(frameStart)) { camera.TriggerSelector.SetValue(TriggerSelector_FrameStart); camera.TriggerMode.SetValue(TriggerMode_Off); } } // camera.AcquisitionMode.SetValue(AcquisitionMode_SingleFrame); ///////////////////////////// // The parameter MaxNumBuffer can be used to control the count of buffers // allocated for grabbing. The default value of this parameter is 10. camera.MaxNumBuffer = 5; // Start the grabbing of c_countOfImagesToGrab images. // The camera device is parameterized with a default configuration which // sets up free-running continuous acquisition. camera.StartGrabbing(c_countOfImagesToGrab); // This smart pointer will receive the grab result data. CGrabResultPtr ptrGrabResult; CImageFormatConverter formatConverter; formatConverter.OutputPixelFormat = PixelType_BGR8packed; Mat openCvImage; CPylonImage pylonImage; ///////////////// 設定曝光時間部分 camera.GainAuto.SetValue(GainAuto_Off); camera.GainRaw.SetValue(camera.GainRaw.GetMin()); camera.ExposureAuto.SetValue(ExposureAuto_Off); camera.ExposureTimeRaw.SetValue(exposuretime); //////////////// // Camera.StopGrabbing() is called automatically by the RetrieveResult() method // when c_countOfImagesToGrab images have been retrieved. while (camera.IsGrabbing()) { c_count--; // Wait for an image and then retrieve it. A timeout of 5000 ms is used. camera.RetrieveResult(5000, ptrGrabResult, TimeoutHandling_ThrowException); // Image grabbed successfully? if (ptrGrabResult->GrabSucceeded()) { // Access the image data. //cout << "SizeX: " << ptrGrabResult->GetWidth() << endl; //cout << "SizeY: " << ptrGrabResult->GetHeight() << endl; const uint8_t *pImageBuffer = (uint8_t *)ptrGrabResult->GetBuffer(); //cout << "Gray value of first pixel: " << (uint32_t)pImageBuffer[0] << endl << endl; formatConverter.Convert(pylonImage, ptrGrabResult); // Create an OpenCV image out of pylon image openCvImage = cv::Mat(ptrGrabResult->GetHeight(), ptrGrabResult->GetWidth(), CV_8UC3, (uint8_t *)pylonImage.GetBuffer()); bool ProcessResult; ProcessResult= imageProcessmain(openCvImage); if (ProcessResult ) { if (c_count == 0) { c_count = c_countOfImagesToGrab; camera.StartGrabbing(c_countOfImagesToGrab); } } else { camera.StopGrabbing(); } #ifdef PYLON_WIN_BUILD // Display the grabbed image. //Pylon::DisplayImage(1, ptrGrabResult); #endif } else { cout << "Error: " << ptrGrabResult->GetErrorCode() << " " << ptrGrabResult->GetErrorDescription() << endl; } } } catch (const GenericException &e) { // Error handling. cerr << "An exception occurred." << endl << e.GetDescription() << endl; exitCode = 1; } // Comment the following two lines to disable waiting on exit. //cerr << endl << "Press Enter to exit." << endl; //while (cin.get() != '\n'); // Releases all pylon resources. PylonTerminate(); return exitCode; }
相關推薦
Basler相機windows Opencv開發2
上一個部落格講到如何安裝pylon以及他們的一些例程,這一章講如何用opencv開啟basler的gige相機。 雖然用常規的方法開啟工業相機是沒有問題的,但是這種方法不好設定相機的引數。 1. 新建一個控制檯程式的工程,設定屬性管理器。 新增i包含目錄 C:\Progra
Windows平臺安裝最新OpenCV-2.4.9,利用Eclipse、MinGW構建C++呼叫OpenCV開發環境
最近電腦重灌系統了,第一件事重灌OpenCV。這次直接裝最新版,2014-4-25日釋出的OpenCV2.4.9版本,下載連結:1、新建資料夾OpenCV2.4.9,然後將348M大小的opencv-2.4.9.exe開啟,路徑選到新建的這個資料夾,可以看到解壓出來有4個多G
Windows Phone開發(2):豎立自信,初試鋒茫
一鍵 優秀 保持 知識 sdn ant emulator 一個 動畫 上一篇文章中,我們聊了一些“大炮”話題,從這篇文章開始,我們一起來學習WP開發吧。 一、我們有哪些裝備。 安裝完VS 學習版 for WP後,也連同SDK一並安裝了,不必像安卓那樣,安裝JDK,下載
OpenCV開發(2)——神經網絡使用示例
rtu cer reads wait 開發 wap 文檔 multi module OpenCV3.4的神經網絡功能主要提供了以下三種: ml模塊中的多層感知機(Artificial Neural Networks - Multi-Layer Perceptrons),
【計算機視覺】opencv靶標相機姿態解算2 根據四個特徵點估計相機姿態 及 實時位姿估計與三維重建相機姿態
https://blog.csdn.net/kyjl888/article/details/71305149 1 基本原理之如何解PNP問題 轉載 基本原理之如何解PNP問題 http://www.cnblogs.com/singlex/p/pose_estimati
OpenCV 3.2.0 + opencv_contrib編譯(Windows)
1 下載原始碼 保證 opencv_contrib 與 opencv 版本一直,因此我這裡都下載github上 opencv 3.2.0的分支 opencv3.2.0 &nb
Windows +Visual Studio 2012+ OpenCV 3.2安裝配置教程
Windows +VS 2012+ OpenCV 3.2安裝配置教程 一、安裝環境 系統:Window 7 旗艦版 64位作業系統 OpenCV 3.2 官網:OpenCV 3.2 IDE:Microsoft Visual Studio 2012 二、安裝步驟
Android逆向基礎筆記—Android NDK開發2之Windows下的gcc手動編譯(交叉連編譯)和利Linux Ubuntu系統下的交叉工具鏈手動編譯
一、交叉工具鏈 這些工具都在NDK的路徑下:E:\Android\android-ndk-r13\toolchains\arm-linux-androideabi-4.9\prebuilt\windo
Basler工業相機基於opencv 採集影象
本實驗在兩個部落格的基礎上實現的,首先是配置opencv http://blog.csdn.net/lili2425960/article/details/54234299 先前查了一些關於win10+opencv3.0(2.xx)+vs配置的文章,準備以此為樣本來配置
大恆工業相機+opencv開發經歷
遇到的問題: 1、開啟Daheng Galaxy Viewer(x64)沒有影象 由於對工業相機不熟悉,原因是沒有安裝鏡頭,安裝鏡頭後可以正常使用,否則只有白色或黑色,用手指靠近鏡頭感測器,可以觀察到螢幕上黑白水紋狀的東西。 2、VS程式訪問出錯,導致無法除錯並藍屏 以下是兩個VS曾經提示
windows OpenCV 2.3.1/Opencv2.4.6 + Python 2.7配置
1 .下載 OpenCV 2.3.1 。文中下載了OpenCV-2.3.1-win-superpack (大概124MB,解壓後1G多)。他不需編譯,使用方便 下載地址 2. OpenCV-2.3.1-win-superpack.exe是自解壓檔案,直接執行。即可解壓。預設解壓到opencv資料夾裡。
Basler|基於OpenCV的Basler相機採集影象程式
採用Basler4.0SDK編寫,利用Event機制在回撥函式中生成灰度影象 回撥函式中影象生成程式碼,利用CCD中獲取的無符號字元型陣列轉變成 Mat型別 Mat grab( siz, CV_8UC1, ptrGrabResult->GetBuffer(),
Windows下 OpenCV 3.2配置和在VS2015下的簡單demo
1. Download the opencv 3.2 https://sourceforge.net/projects/opencvlibrary/files/opencv-win/3.2.0/opencv-3.2.0-vc14.exe/download
Windows Phone開發(5):室內裝修
表示 index can 進行 解釋 技術 面板 啟動 垂直 為什麽叫室內裝修呢?呵呵,其實說的是布局,具體些嘛,就是在一個頁面中,你如何去擺放你的控件,如何管理它們,你說,像不像我們剛搬進新住所,要“裝修”一番?買一套什麽樣的茶幾和杯具(我說的“杯具”指的是原意,不要理解
Windows Phone開發(6):處理屏幕方向的改變
cati sources mon stack mar ber XML break pac 俺們都知道,智能手機可以通過旋轉手機來改變屏幕的顯示方向,更多的時候,對於屏幕方向的改變,我們要做出相應的處理,例如,當手機屏幕方向從縱向變為橫向時,可能要重新排列頁面上的控件以適應顯
Windows Phone開發(7):當好總舵主
發的 content 數據 new 窗口 sdn 內容 str 剛才 吹完了頁面有關的話題,今天我們來聊一下頁面之間是如何導航的,在更多情況下,我們的應用程序不會只有一個頁面的,應該會有N個,就像我們做桌面應 用開發那樣,我們一個應用程序中可能不止一個窗體(極簡單的程序除外
Windows Phone開發(3):棋子未動,先觀全局
csdn xaml hone activate 處理程序 為什麽 作業 單擊 不執行 在進行WP開發之前,與其它開發技術一樣,我們需要簡單了解一個WP應用序的生命周期,我們不一定要深入了解,但至少要知道在應用程序生命周期內的每一階段,我們應當做什麽,不推薦哪些操作等,這也是
Windows Phone開發(10):常用控件(上)
androi chm att size near grid txt idt inf Windows Phone的控件有幾個來源,和傳統的桌面應用程序開發或Web開發一樣,有默認提供的控件和第三方開者發布的控件。一般而言,如果不是過於復雜的界面布局,使用默認控件就足矣。相比之
Windows Phone開發(19):三維透視效果
end 理論知識 form 之間 3d模型 中間 第一個 一個 好的 三維效果也可以叫透視效果,所以,我幹脆叫三維透視效果。理論知識少講,直接用例開場吧,因為這個三維效果其實很簡單,比上一節中的變換更省事,不信?一起來做一做練習吧。 練習一:把對象沿Y軸旋轉45度。 默認情
Windows Phone開發(15):資源
樣式表 為什麽 sent name for cor 控件 tar resource 活字印刷術是我國“四大發明”之一,畢昇在發明活字印刷術之後,他很快發現一個問題,隨著要印刷資料的不斷增加,要用到的漢字數目越來越多,於是,他必須尋找一種有效的辦法去管理那些刻有漢字的立方體(