1. 程式人生 > >Basler相機windows Opencv開發2

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開發2Windows下的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|基於OpenCVBasler相機採集影象程式

採用Basler4.0SDK編寫,利用Event機制在回撥函式中生成灰度影象 回撥函式中影象生成程式碼,利用CCD中獲取的無符號字元型陣列轉變成 Mat型別 Mat grab( siz, CV_8UC1, ptrGrabResult->GetBuffer(),

WindowsOpenCV 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 活字印刷術是我國“四大發明”之一,畢昇在發明活字印刷術之後,他很快發現一個問題,隨著要印刷資料的不斷增加,要用到的漢字數目越來越多,於是,他必須尋找一種有效的辦法去管理那些刻有漢字的立方體(