Перейти к содержимому
Compvision.ru

L@MER

Пользователи
  • Количество публикаций

    80
  • Зарегистрирован

  • Посещение

  • Days Won

    3

Сообщения, опубликованные пользователем L@MER


  1. "Rotation model images stitcher.\n\n"

    "stitching img1 img2 [...imgN]\n\n"

    "Flags:\n"

    " --try_use_gpu (yes|no)\n"

    " Try to use GPU. The default value is 'no'. All default values\n"

    " are for CPU mode.\n"

    " --output <result_img>\n"

    " The default is 'result.jpg'.\n";

    Скомпилировал. Создал exe. Запустил через командную строку. Программа написала Rotation и т.д. И все. Я так и не понял как она должна определить какие изображения ей склеивать. Поместил картинки в папку с программой. Обозвал их img1 и img2...пофиг. Как оно работает. Прошу пояснений...


  2. Доброго времени суток. Жизнь заставила вернуться к теме двухлетней давности. На данный момент реализован лабораторный стенд, условный чертеж которого показан на вложенном рисунке.

    Установка представляет собой два генератора лазерных линий, подсвечивающих с двух сторон профиль детали. Так-же с двух сторон расположены видеокамеры. Положение генераторов лазерных линий и камер, относительно дуг друга фиксировано и известно. Реализован алгоритм фильтрации и выделения лазерного луча. Также реализован алгоритм получения двумерных координат точек оси лазерного луча.

    Сейчас стоит задача определить пространственные координаты точек лазерной линии, определяющей профиль на детали. Для этого предполагаю использовать метод оптической лазерной триангуляции, предварительно осуществив калибровку камер. Прочел много литературы, но все равно остался ряд вопросов:

    1. В OpenCV есть функция cvTriangulatePoints, но она работает только со стерео картинкой. Нет ли готовой функции или кода, позволяющего реализовать триангуляцию такого типа (и соответственно определять расстояние до точек профиля детали, подсвеченных лазерным излучением) по одному изображению, зная положение камеры и источника лазерного излучения? Не хочется изобретать велосипед так сказать.

    2. Калибровка камеры по шахматной доске дает хорошие результаты? В OpenCV это наилучший вариант?

    3. Какую систему пространственных координат лучше применить? Я планировал привязать начало координат к одному из источников лазерного излучения. Это наилучшее решение?

     

    сканирование0001.jpg


  3. В общем, в процессе экспериментов выявлено, что средствами OpenCV одновременно открыть потоки с двух промышленных камер Basler USB3.0 не получается никакими танцами с бубном или без оного. Проблему решил совместив открытие потоков и захват при помощи Basler Pylon SDK (см.код выше) и дальнейшую обработку и вывод на форму средствами OpenCV. При этом открытие потоков и захват реализованы в одном потоке. Попытки вначале распаралелить открытие и захват на два потока привело к конфликтам и ошибкам. Совмещение в одном потоке обеспечило стабильную работу.

     

    P.S. Как показала практика при захвате и обработка одного цветного изображений разрешением 2590х1940 13 fps средствами OpenCV отьедает приблизительно 120-130 Мб оперативной памяти. При захвате цветного изображения разрешением 2590х1940 13 fps средствами Basler SDK и обработке средствами OpenCV отъедает только 60-80 Мб оперативной памяти. Загрузка процессора Core i5 в обоих случаях составляет от 85-96%. При этом изображение на форме достаточно плавное. При включении фильтра Гаусса с одним изображением получаю тормоза, с двумя изображениями такого формата и разрешения на форме - супертормоза. Принял решение в дальнейшем перейти на mono8, благо задача позволяет и использовать ROI, т.к. усреднять ВСЕ изображение такого разрешения нецелесообразно с точки зрения использования ресурсов компьютера.


  4. А посмотри какие dll подгружает Basler SDK, а какие твоя программа про проигрывании видео (можно с помощью ProcessExplorer от Руссиновича). Так можно узнать с помощью чего осуществляется захват с камеры. Ищется что-то типа dshowxxx.dll, но лучше выложи полные списки.

     

    Вот что подгружает Basler SDK:

     

    Basler SDK.txt

     

    Вот что подгружает моя прога на OpenCV:

     

    OpenCV.txt

     

    С ходу посмотрел, что и та и та программы подгружают одинаковые dll от Basler.

    По dll от данного производителя различие только в двух компонентах, программа от Basler подгружает еще вот это:

     

    PylonGUI_MD_VC100.dll    pylonGUI Module    Basler    C:\Program Files\Basler\pylon 4\pylon\bin\x64\PylonGUI_MD_VC100.dll

    PylonUtility_MD_VC100.dll

     

    Их вызов обеспечивается в начале Basler SDK:

    // Include files to use the PYLON API.
    #include <pylon/PylonIncludes.h>
    #include <pylon/PylonGUI.h>
    // Namespace for using pylon objects.
    using namespace Pylon;
    
    int main(int argc, char* argv[])
    {
    	CTlFactory& tlFactory = CTlFactory::GetInstance();
    	// Get all attached devices and exit application if no device is found.
    	DeviceInfoList_t devices;
    	if (tlFactory.EnumerateDevices(devices) == 0)
    	{
    		throw RUNTIME_EXCEPTION("No camera present.");
    	}
    	// Create an instant camera object with the camera device 0.
    	CInstantCamera camera_1(tlFactory.CreateDevice(devices[0]));
    	CInstantCamera camera_2(tlFactory.CreateDevice(devices[1]));
    	// Start the grabbing 
    	camera_1.StartGrabbing();
    	camera_2.StartGrabbing();
    	// This smart pointer will receive the grab result data.
    	CGrabResultPtr ptrGrabResult_1;
    	CGrabResultPtr ptrGrabResult_2;
    	while (1)
    	{
    		// Wait for an image and then retrieve it. A timeout of 5000 ms is used.
    		camera_1.RetrieveResult(5000, ptrGrabResult_1, TimeoutHandling_ThrowException);
    		camera_2.RetrieveResult(5000, ptrGrabResult_2, TimeoutHandling_ThrowException);
    		// Display the grabbed image.
    		Pylon::DisplayImage(1, ptrGrabResult_1);
    		Pylon::DisplayImage(2, ptrGrabResult_2);
    	}
    }
    

  5. А ОС какая?

    Windows 7 Professional 64 bit. Пробовал на двух ноутах. На обоих есть пара USB3.0. Та-же картина. USB2.0 камер хоть четыре работают. А из двух подключенных USB3.0 работает только одна. При этом средствами Basler SDK запускаю пару USB3.0 камер совместно на ура.


  6. Нет, вторую камеру он не открывает вообще.

    Открывает только VideoCapture cap_1(1).

    VideoCapture cap_2(2) - не открывает.

    При этом, провел эксперимент.

    Подключил встроенную вебкамеру ноута, внешнюю вебкамеру USB2.0 и внешнюю камеру USB3.0 - все ОК.

     

    VideoCapture cap_0(0) - встроенная камера ноута

    VideoCapture cap_1(1) - USB2.0

    VideoCapture cap_2(2) - USB3.0

     

    Короче засада именно в параллельной работе USB3.0 камер, точнее в их открытии...


  7. В проекте используются две камеры USB3.0. Обе висят на одном хост-контроллере на двух USB3.0 портах ноутбука.

     

    Открываю видеопоток:

     

    VideoCapture cap_1(1); // Открываем камеру (1)
    VideoCapture cap_2(2); // Открываем камеру (2)

     

    При этом в программе видно изображение только одной из камер.

    Если вместо одной из USB3.0 камер подключаю USB2.0 камеру, то все хорошо - транслируется картинка и с USB3.0 и c USB2.0 камеры.

    Вначале грешил, что при разрешении в 5МП хост USB3.0 не протягивает две камеры. Так нет, запускаю программу тестовую, что шла с USB3.0 камерами - две картинки с двух камер без тормозов на полном разрешении. Уменьшал разрешение камер - пофиг, через OpenCV все-равно  затык...видится только одна.

    В каком направлении думать? Ощущение что OpenCV не нравится, что они на одном хосте сидят...походу придется внешний хост покупать....Или может у кого похожая ситуация была...кто как решал?


  8. Написал компот - основная прога на VC6.0 + отображение информации с двух камер в виде DLL на VC2008. На моей машине все работает(стоит XP + две установленные студии 6 и 2008). Пошел к заказчику и него Win7 и только установленная 6 студия. Если запускать с рабочего стола то вылетает окошко для ввода источника видео(текст в окошке - выберите видео-устройство и там можно получить их список). После выбора все работает.

      При запучке из под 6 студио запроса нет - и не происходит захвата с камеры

     Собственно вопроса 2 - как в Win7 победить окошко с запросом выбора видеоустройства , и как запустить под отладчиком 6 студии. Хотя подозреваю если получится победить окошко с запросом на выбор видеоустройства и под шестой студией все заведется.

      Камеры захватываю так

     

      static CvCapture* m_Capture[CAMERA_QUAN] = {NULL,NULL};      

     

      m_Capture[0]= cvCreateCameraCapture(CV_CAP_ANY);  //CV_CAP_ANY); //cvCaptureFromCAM( 0 );

      for(iLoop = 1; iLoop < 800; iLoop ++){        

        m_Capture[1]= cvCreateCameraCapture(iLoop); //cvCaptureFromCAM( 0 );capture[2]

         if (m_Capture[1] != NULL) break; // нашли камеру

      }         

      if ( (m_Capture[0] == NULL) || (m_Capture[1] == NULL) )

        return(1);  // не все камеры подключились

     

    Жду Вашей помощи коллеги

     

    По окошку с выбором камер. Была такая-же петрушка - выползало окошка с предложением выбора камер, имеющихся в наличии на компе с Windows 7 64 bit. К этому прилагалась обязательная ошибка при выборе встроенной камеры на ноутбуке. Использовал при этом cvCreateCameraCapture(CV_CAP_ANY). Ничего не помогало. Плюнул на все и использовал класс VideoCapture для подключения к камерам и захвата изображений. При этом все захватывается с любых USB камер, даже промышленных и окошко выбора камер не вываливается.


  9. Без проблем установилось и интегрировало OpenCV3.0 в VS2013. Автоматически прописывает пути к lib и inсlude OpenCV при генерации проекта. При генерации формирует основной код, который обеспечивает сборку простейшего проекта с захватом и отображением в отдельном окне. В общем удобно.

    • Like 1

  10. width и height проверьте, небось отрицательные или нулевые, или еще ерунда какая нибудь.

     

    Ага, это я уже нашел. Закомментировал часть кода. Присвоил значения - константы. Все прекрасно заработало.

     

    Вот кусок кода:

    void DrawData(IplImage*_frame, CDC*dc)
    {
    	// RECT r; // Структура RECT содержит координаты четырех углов прямоугольника
    	// dc->GetClipBox(&r); //GetClipBox-cчитывает огpаничивающий пpямоугольник вокpуг текущей области выpезания, r - принимающая структура типа RECT
    	// int width = r.right - r.left;
    	// int height = r.bottom - r.top;
    	int width = 400;
    	int height = 300;
    	IplImage *img = cvCreateImage(cvSize(width, height), _frame->depth, _frame->nChannels);
    	cvResize(_frame, img);
    

    Как показывает отладка в структуре r:

    r.right =0, r.left=0, r.bottom=0, r.top=0

    Т.е. dc->GetClipBox(&r) не работает, хотя прописывал Wingdi.h (include Windows.h), подключал напрямую lib c Gdi32.lib. И Gdi32.dll в системе присутствует.

    Ну и шут с ним, это не критично, главное вывод в Picture Control состоялся! Теперь дело пойдет!

    Да, немного понаблюдал, утечек памяти в диспетчере задач замечено не было...

     

    P.S. Тему можно переименовывать с Вывод видео на форму в visual studio 2008 - 2010 в Вывод видео на форму в visual studio 2008 - 2013

    В общем предложенный в методичке способ с небольшой корректировкой пошел на MSVS2013 на Windows7 64bit.


  11. Есть подозрение что камера не поддерживается. 

    Попробуйте считать изображение из файла и вывести его.

     

    Как ни странно да. Хотя при создании консольного проложения с той-же opencv3.0 эта usb-камера открывалась. Подцепил другую - видит!

    Но при этом появилось две странности.

     

    Первая:работает программа и на форме формируется картинка, далее я открываю какое-нибуть окно, программу или диспетчер задач, как программа моя перестает работать и выводится ошибка:

     

    post-1271-0-89187300-1427227531_thumb.jp

     

    Вторая ерунда:при закрытии программы вылетает ошибка:

     

    post-1271-0-62758500-1427227526_thumb.jp

     

    В компиляторе при отладке (после ошибки при закрытии программы) пишет:

     

    Поток 0xd38 завершился с кодом 0 (0x0).

    Программа "[1540] CVPROF.exe" завершилась с кодом 2 (0x2).

     

    Я почитал, народ пишет что такая ошибка может возникать если программу под пользователем с ограниченными правами запускаешь. ПРобовал под Администратором - таже петрушка.

     

    Если начинаю отлаживать в целом весь проект, то выдает такое сообщение:

     

    post-1271-0-19069900-1427228271_thumb.jp

     

    Походу ругается на строку кода, где IPlImage....


  12. Видимо камера не открылась, или assert сработал не как задумано автором. 

    Попробуйте закомментировать assert.

     

    Закоментировал. Ошибка со ссылкой на assert пропала. Теперь просто программа запускается и сразу появляется окно Windows "Прекращена работа программы"...Камера молчит...


  13. Думаю это решается путем инициализации App. Присвойте App=NULL при объявлении.

     

    Да, инициализировал. Помогло. Нашел еще пару ошибок. Получилось все как в методичке.

    Удалось собрать проект. Но при запуске .exe возникли проблемы:

     

    1. При запуске открывается форма. Загорается светодиод камеры (т.е. подключение к камере осуществляется), но при этом на форме лишь серый прямоугольник. После нескольких секунд появляется сообщение (см.рис.1).

     

    post-1271-0-53004500-1427141214_thumb.jp

     

    Закрываю программу.

     

    2. Когда пытаюсь запустить снова, появляется окно выбора камеры (см.рис.2).

     

    post-1271-0-62671600-1427141220_thumb.jp

     

    Выбираю камеру. Жму ОК.

     

    3. Тут же прилетает ошибка (см.рис.3)

     

    post-1271-0-91757500-1427141225_thumb.jp

     

    Строка 289 на которую ссылается окно с ошибкой в следующем участке кода:

    BOOL CCVPROFDlg::OnInitDialog()
    {
    	CDialogEx::OnInitDialog();
    
    	// Добавление пункта "О программе..." в системное меню.
    
    	// IDM_ABOUTBOX должен быть в пределах системной команды.
    	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
    	ASSERT(IDM_ABOUTBOX < 0xF000);
    
    	CMenu* pSysMenu = GetSystemMenu(FALSE);
    	if (pSysMenu != NULL)
    	{
    		BOOL bNameValid;
    		CString strAboutMenu;
    		bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
    		ASSERT(bNameValid);
    		if (!strAboutMenu.IsEmpty())
    		{
    			pSysMenu->AppendMenu(MF_SEPARATOR);
    			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
    		}
    	}
    
    	// Задает значок для этого диалогового окна.  Среда делает это автоматически,
    	//  если главное окно приложения не является диалоговым
    	SetIcon(m_hIcon, TRUE);			// Крупный значок
    	SetIcon(m_hIcon, FALSE);		// Мелкий значок
    
    	// Чтобы каждый раз не обращаться
    	// Освобождаемся в функции закрытия формы	
    
    	cap_dc = m_cap.GetDC();
    	capture = cvCaptureFromCAM(0);
    	
    	// Создаем поток захвата видео
    	hThread = CreateThread(
    		NULL,
    		0,
    		InstanceThread,
    		0,
    		0,
    		&dwThreadId); 
    	assert(capture);
    
    	return TRUE;  // возврат значения TRUE, если фокус не передан элементу управления
    }
    

    т.е. проблема в assert(capture); Что это может быть?


  14. Обещанная статейка: attachicon.gifOpencv23Vs2010.pdf

     

    Visual Studio 2013

    OpenCV+MFC. Пытаюсь отладить программу (написана согласно методичке).

    При отладке ругается:

     

    2    IntelliSense: Предупреждение PCH:     d:\VISUAL STUDIO PROJECT\CVPROF\CVPROFDlg.cpp    1    1    CVPROF

    1    error C4703: используется потенциально неинициализированная локальная переменная-указатель "App"    d:\visual studio project\cvprof\cvprofdlg.cpp    251    1    CVPROF

     

    Код приведен ниже...

     

    // CVPROFDlg.cpp : файл реализации
    //
    
    #include "stdafx.h"
    #include "CVPROF.h"
    #include "CVPROFDlg.h"
    #include "afxdialogex.h"
    #include "opencv2/opencv.hpp"
    
    #ifdef _DEBUG
    #define new DEBUG_NEW
    #endif
    #define WIDTHBYTES(bits) ((((bits) + 31) / 32) * 4)
    CStatic m_cap;
    CvCapture*capture;
    IplImage*frame;
    CDC*cap_dc;
    DWORD WINAPI InstanceThread(LPVOID);
    DWORD dwThreadId = 0;
    HANDLE hThread = NULL;
    HBITMAP CreateRGBBitmap(IplImage* _Grab);
    // Диалоговое окно CAboutDlg используется для описания сведений о приложении
    
    class CAboutDlg : public CDialogEx
    {
    public:
    	CAboutDlg();
    
    // Данные диалогового окна
    	enum { IDD = IDD_ABOUTBOX };
    
    	protected:
    	virtual void DoDataExchange(CDataExchange* pDX);    // поддержка DDX/DDV
    
    // Реализация
    protected:
    	DECLARE_MESSAGE_MAP()
    };
    
    CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD)
    {
    }
    
    void CAboutDlg::DoDataExchange(CDataExchange* pDX)
    {
    	CDialogEx::DoDataExchange(pDX);
    }
    
    BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
    END_MESSAGE_MAP()
    
    
    // диалоговое окно CCVPROFDlg
    
    
    
    CCVPROFDlg::CCVPROFDlg(CWnd* pParent /*=NULL*/)
    	: CDialogEx(CCVPROFDlg::IDD, pParent)
    {
    	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
    }
    
    void CCVPROFDlg::DoDataExchange(CDataExchange* pDX)
    {
    	CDialogEx::DoDataExchange(pDX);
    	DDX_Control(pDX, IDC_CAP_STATIC, m_cap);
    }
    
    BEGIN_MESSAGE_MAP(CCVPROFDlg, CDialogEx)
    	ON_WM_SYSCOMMAND()
    	ON_WM_PAINT()
    	ON_WM_QUERYDRAGICON()
    	ON_BN_CLICKED(IDOK, &CCVPROFDlg::OnBnClickedOk)
    	ON_WM_CLOSE()
    END_MESSAGE_MAP()
    
    
    // обработчики сообщений CCVPROFDlg
    
    BOOL CCVPROFDlg::OnInitDialog()
    {
    	CDialogEx::OnInitDialog();
    
    	// Добавление пункта "О программе..." в системное меню.
    
    	// IDM_ABOUTBOX должен быть в пределах системной команды.
    	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
    	ASSERT(IDM_ABOUTBOX < 0xF000);
    
    	CMenu* pSysMenu = GetSystemMenu(FALSE);
    	if (pSysMenu != NULL)
    	{
    		BOOL bNameValid;
    		CString strAboutMenu;
    		bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
    		ASSERT(bNameValid);
    		if (!strAboutMenu.IsEmpty())
    		{
    			pSysMenu->AppendMenu(MF_SEPARATOR);
    			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
    		}
    	}
    
    	// Задает значок для этого диалогового окна.  Среда делает это автоматически,
    	//  если главное окно приложения не является диалоговым
    	SetIcon(m_hIcon, TRUE);			// Крупный значок
    	SetIcon(m_hIcon, FALSE);		// Мелкий значок
    
    	// TODO: добавьте дополнительную инициализацию
    
    	return TRUE;  // возврат значения TRUE, если фокус не передан элементу управления
    
    	cap_dc = m_cap.GetDC();
    	capture = cvCreateCameraCapture(CV_CAP_ANY);
    	hThread = CreateThread(
    		NULL, 
    		0, 
    		InstanceThread, 
    		0, 
    		0, 
    		&dwThreadId); 
    	assert(capture);
    }
    
    void CCVPROFDlg::OnSysCommand(UINT nID, LPARAM lParam)
    {
    	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
    	{
    		CAboutDlg dlgAbout;
    		dlgAbout.DoModal();
    	}
    	else
    	{
    		CDialogEx::OnSysCommand(nID, lParam);
    	}
    }
    
    // При добавлении кнопки свертывания в диалоговое окно нужно воспользоваться приведенным ниже кодом,
    //  чтобы нарисовать значок.  Для приложений MFC, использующих модель документов или представлений,
    //  это автоматически выполняется рабочей областью.
    
    void CCVPROFDlg::OnPaint()
    {
    	if (IsIconic())
    	{
    		CPaintDC dc(this); // контекст устройства для рисования
    
    		SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
    
    		// Выравнивание значка по центру клиентского прямоугольника
    		int cxIcon = GetSystemMetrics(SM_CXICON);
    		int cyIcon = GetSystemMetrics(SM_CYICON);
    		CRect rect;
    		GetClientRect(&rect);
    		int x = (rect.Width() - cxIcon + 1) / 2;
    		int y = (rect.Height() - cyIcon + 1) / 2;
    
    		// Нарисуйте значок
    		dc.DrawIcon(x, y, m_hIcon);
    	}
    	else
    	{
    		CDialogEx::OnPaint();
    	}
    }
    
    // Система вызывает эту функцию для получения отображения курсора при перемещении
    //  свернутого окна.
    HCURSOR CCVPROFDlg::OnQueryDragIcon()
    {
    	return static_cast<HCURSOR>(m_hIcon);
    }
    
    
    
    void CCVPROFDlg::OnBnClickedOk()
    {
    	// TODO: добавьте свой код обработчика уведомлений
    	CDialogEx::OnOK();
    }
    
    
    void CCVPROFDlg::OnClose()
    {
    	CloseHandle(hThread);
    	cvReleaseCapture(&capture);
    	ReleaseDC(cap_dc);
    	CDialogEx:: OnClose();
    }
    
    //---------------------------------------------------------------------------
    HBITMAP CreateRGBBitmap(IplImage* _Grab)
    {
    	char *App;
    	IplImage *_Grab3 = 0, *_Grabf = 0;
    
    	LPBITMAPINFO lpbi = new BITMAPINFO;
    
    	lpbi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
    	lpbi->bmiHeader.biWidth = _Grab->width;
    	lpbi->bmiHeader.biHeight = _Grab->height;
    	lpbi->bmiHeader.biPlanes = 1;
    	lpbi->bmiHeader.biBitCount = 24;
    	lpbi->bmiHeader.biCompression = BI_RGB;
    	lpbi->bmiHeader.biSizeImage = WIDTHBYTES((DWORD)_Grab->width * 8) * _Grab->height;
    	lpbi->bmiHeader.biXPelsPerMeter = 0;
    	lpbi->bmiHeader.biYPelsPerMeter = 0;
    	lpbi->bmiHeader.biClrUsed = 0;
    	lpbi->bmiHeader.biClrImportant = 0;
    
    	void *pBits;
    	HBITMAP hBitmap = CreateDIBSection(NULL, lpbi, DIB_RGB_COLORS,
    		(void **)&pBits, NULL, 0);
    	delete lpbi;
    
    	if (hBitmap)App = (char*)pBits;
    
    	if (_Grab->depth != IPL_DEPTH_8U)
    	{
    		_Grabf = cvCloneImage(_Grab);
    		if (_Grab)
    		{
    			cvReleaseImage(&_Grab);
    		}
    		_Grab = cvCreateImage(cvSize(_Grabf->width, _Grabf->height), IPL_DEPTH_8U, _Grabf->nChannels);
    		cvConvert(_Grabf, _Grab);
    		if (_Grabf)
    		{
    			cvReleaseImage(&_Grabf);
    		}
    	}
    
    	if (_Grab->nChannels == 1)
    	{
    		_Grab3 = cvCreateImage(cvSize(_Grab->width, _Grab->height), IPL_DEPTH_8U, 3);
    		cvMerge(_Grab, _Grab, _Grab, NULL, _Grab3);
    	}
    
    	if (_Grab->nChannels == 3)
    	{
    		_Grab3 = _Grab;
    	}
    
    	unsigned char *data;
    	cvGetRawData(_Grab3, (uchar**)&data);
    
    	if (_Grab3)
    	{
    		for (int i = 0; i < _Grab->height; i++)
    		{
    			memcpy(App + _Grab3->widthStep*(_Grab3->height - i - 1), data + _Grab3->widthStep*i, _Grab3->width * 3);
    		}
    	}
    
    	if (_Grab->nChannels == 1)
    	{
    		cvReleaseImage(&_Grab3);
    	}
    
    	return hBitmap;
    }
    //----------------------------------------------------------------------------------
    void DrawData(IplImage*_frame, CDC*dc)
    {
    	RECT r;
    	dc->GetClipBox(&r);
    	int width = r.right-r.left;
    	int height = r.bottom-r.top;
    	IplImage *img = cvCreateImage(cvSize(width, height), _frame->depth, _frame->nChannels);
    	cvResize(_frame, img);
    	HBITMAP pBitmap;
    	pBitmap = CreateRGBBitmap(img);
    	HDC hMemDC = CreateCompatibleDC(dc->m_hDC);
    	HGDIOBJ hOldBm = SelectObject(hMemDC, pBitmap);
    	BitBlt(dc->m_hDC, 0, 0, width, height, hMemDC, 0, 0, SRCCOPY);
    	SelectObject(hMemDC, hOldBm);
    	DeleteDC(hMemDC);
    	DeleteObject(pBitmap);
    	cvReleaseImage(&img);
    }
    

  15. На сайте http://opencv.org появилась ссылка на плагин Out of the box OpenCV C++ development plugin for Visual Studio от компании Ceemple: http://opencv.org/ceemple-opencv-distribution-for-visual-studio.html

     

    Capture-300x207.png

     

    Заявленные плюшки:

     

    Features:

    • Pre-compiled OpenCV v3.0 built with CUDA, OpenCL, OpenMP, and IPP
    • Support for Windows 64 bit and Visual Studio 2013
    • Auto installation of Microsoft Image Watch plugin
    • OpenCV new project wizard
    • 70+ examples of OpenCV and CUDA.

    Benefits:

    • Start programming using OpenCV immediately within Visual Studio.
    • OpenCV is ready for use, built with complementary libraries.
    • No need for long setups, configurations and adaptation of OpenCVfor Visual Studio.
    • Learn from the numerous code examples provided.
    • Debug with Microsoft Image Watch plugin.

    Кто-нибуть пробовал пользоваться? По всей видимости очень интересное решение, позволяющее повысить удобство пользования библиотекой OpenCV в VS и обеспечить беспроблемную установку и интеграцию OpenCV3.0 и VS2013.....

    • Like 1

  16. В общем, прошла неделя консультаций и писем от поставщиков и интеграторов камер Basler и JAI. Результат - обе эти камеры (точнее их ПО) могут взаимодействовать с OpenCV. И там и там есть реализованные проекты с OpenCV. В программном пакете JAI SDK имеется три примера интеграции на C++. ПО Basler к тому-же поддерживает DirectShow.

     

    В общем, может быть кому-нибуть данная веточка и информация пригодится.

    • Like 1

  17. Кстати, раз зашел разговор о промышленных камерых. Может кто-нибудь посоветует камеру с низким разрешением (1.3Mp за глаза) но приличным качеством? А то все варианты, какие я встречал что у basler, что у continental идут с 5Mp, и переплачивать за неиспользуемое разрешение как-то не оченб хочется.

     

    Вот например у BASLER: http://www.baslerweb.com/ru/produkty/matrichnye-kamery/ace/aca1300-30uc


  18. з.ы. а можно поинтересоваться, под какие задачи вы эти камеры собираетесь использовать? Это ведь сильно не бюджетный вариант, с ценниками от 500$...

     

    Распознавание профиля изделий в тяжелой промышленности в процессе формовки. Там серьезные требования к применяемым камерам. Использоваться будут две камеры (каждая в районе 1000 евро) и генераторы лазерной линии для формирования изображения профиля.


  19. Здравствуйте форумчане!

     

    Планирую применить в своей разработке промышленные видеокамеры (JAI GO или BASLER асе) с интерфейсами USB3Vision со стандартом передачи данных GenIcam (см.вложенный PDF файл). Для данных видеокамер производитель предусматривает собственные SDK, так в инструкции для SDK JAI написано:

     

    The JAI SDK consists of two APIs (Application Programming Interfaces):

    1. Jai_Factory.dll: Windows DLL with “Plain” C-interface and C/C++ header file with all functions and parameter types defined. This makes it possible to use JAI SDK in almost any programming language available for the Windows platform.

     

    2. Jai_FactoryDotNET.dll: Managed Windows DLL (.NET Framework 2.0). This DLL exposes the “Plain” function interface PLUS an “object-oriented” API. The object-oriented API encapsulates the “standard use” of the “plain” C-interface API.

     

    Далее там-же описаны примеры интеграции в проекты, написанные на Microsoft Visual Studio 2005 C/C++, С# и т.п. (см.вложенный PDF файл).

     

    В проекте своем планирую применить библиотеку OpenCV,  так как имею опыт работы с ней и данная библиотека меня всем устраивает. До этого с данной библиотекой создавал приложения, работающие со стандартными вебкамерами по интерфейсу USB2.0. Там все понятно. В данном случае же прошу консультации есть ли возможность подружить видеокамеры, описанные мною выше с OpenCV (связка USB3Vision+Genicam+OpenCV). Есть ли успешно реализованные проекты на основе OpenCV и USB3Vision+GenIcam? Какие возможны подводные камни при получении изображения в OpenCV с таких камер.

     

    P.S. Не хотелось бы ошибиться и купить камеру, которую невозможно потом будет привязать к OpenCV, т.к.данные камеры не дешевые.

     

    Заранее благодарен за внимание к теме!

    JAI-SDK-Getting-Started-Guide_revK.pdf

    genicam_basler.pdf


  20. Если имеется ввиду склейка, что то типа такого:

    http://www.emgu.com/wiki/index.php/Image_Stitching_in_CSharp

    то есть пример stitching_detailed.cpp

    Большое спасибо. Именно это я и искал. Я так понимаю нужно будет скачать последний OpenCV, т.к. в папке samples версии 2.1 у меня такого примера нет. Еще раз респект!


  21. что то я не понял, одно кольцо- сечение вы получаете с одними и теми же настройками т.к. камеры с лазерами зафиксированы.

    а сдвиг образца во времени будет влиять только на общую 3д реконструкцию, т.е. объединение сечений в 1 3д объект, да и то тут сложность только если ось объекта будет иметь разное отклонение от перпендикуляра плоскости сканирования.

    Именно так - ось обьекта может отклоняться...Но эту проблему я решу. Как я говорил ранее у меня основной затык не в железе или том как снять четыре изображения. Допустим я из получил и функциями OpenCV развернул и убрал влияние перспективы. Как, какими функциями OpenCV можно корректно склеить их в единую картинку, сформировав единый профиль?


  22. Спасибо откликнувшимся. Вручную развороты совмещать и потом по этому пути программно проводить не получится - изделие не строго фиксировано, а может несколько смещаться. Хорошие ссылки - хорошие мысли. Отдельный респект за ссылку на 3D камеры. Но аппаратная сторона меня не очень беспокоит. Камеры и точки их установки я подберу, выбор есть. Одна видеокамера не даст нужного результата - требуется минимум две, а лучше три или четыре. Это не суть важно. Для меня проблема именно в алгоритме совмещения изображений и наличия в OPENCV таковых функций.


  23. вообще я думаю что если это будут дуги, то будет плохо совмещаться или надо делать ограничение на перекрытие.

    по большому счёту если у вас лазеры с камерами зафиксированны неподвижно относительно центра системы, то помоему не проблема 1 раз совместить, т.е. откалибровать.

    Да все будет стоять неподвижно и естественно откалибровано. Вопрос не в механике и т.п. Вопрос как совместить картинки с 4 камер?

×