Jump to content
Compvision.ru

L@MER

Пользователи
  • Content count

    80
  • Joined

  • Last visited

  • Days Won

    3

L@MER last won the day on April 3 2015

L@MER had the most liked content!

Community Reputation

6 Новичек

About L@MER

  • Rank
    Эксперт
  • Birthday 10/01/1983

Profile Information

  • Пол
    Мужской
  • Расположение
    Рязань

Recent Profile Visitors

1,092 profile views
  1. Скомпилировал. Создал exe. Запустил через командную строку. Программа написала Rotation и т.д. И все. Я так и не понял как она должна определить какие изображения ей склеивать. Поместил картинки в папку с программой. Обозвал их img1 и img2...пофиг. Как оно работает. Прошу пояснений...
  2. Доброго времени суток. Жизнь заставила вернуться к теме двухлетней давности. На данный момент реализован лабораторный стенд, условный чертеж которого показан на вложенном рисунке. Установка представляет собой два генератора лазерных линий, подсвечивающих с двух сторон профиль детали. Так-же с двух сторон расположены видеокамеры. Положение генераторов лазерных линий и камер, относительно дуг друга фиксировано и известно. Реализован алгоритм фильтрации и выделения лазерного луча. Также реализован алгоритм получения двумерных координат точек оси лазерного луча. Сейчас стоит задача определить пространственные координаты точек лазерной линии, определяющей профиль на детали. Для этого предполагаю использовать метод оптической лазерной триангуляции, предварительно осуществив калибровку камер. Прочел много литературы, но все равно остался ряд вопросов: 1. В OpenCV есть функция cvTriangulatePoints, но она работает только со стерео картинкой. Нет ли готовой функции или кода, позволяющего реализовать триангуляцию такого типа (и соответственно определять расстояние до точек профиля детали, подсвеченных лазерным излучением) по одному изображению, зная положение камеры и источника лазерного излучения? Не хочется изобретать велосипед так сказать. 2. Калибровка камеры по шахматной доске дает хорошие результаты? В OpenCV это наилучший вариант? 3. Какую систему пространственных координат лучше применить? Я планировал привязать начало координат к одному из источников лазерного излучения. Это наилучшее решение?
  3. USB3Vision+Genicam+OpenCV

    В общем, в процессе экспериментов выявлено, что средствами 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. USB3Vision+Genicam+OpenCV

    Вот что подгружает 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. USB3Vision+Genicam+OpenCV

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

    Нет, вторую камеру он не открывает вообще. Открывает только 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. USB3Vision+Genicam+OpenCV

    В проекте используются две камеры 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. OpenCV две камеры

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

    Как показала практика BASLER асе с интерфейсами USB3Vision прекрасно находится через VideoCapture cap(). А вот через CvCapture* capture = cvCreateCameraCapture(CV_CAP_ANY) нет. Это на заметку!
  10. Ceemple OpenCV distribution for Visual Studio

    Без проблем установилось и интегрировало OpenCV3.0 в VS2013. Автоматически прописывает пути к lib и inсlude OpenCV при генерации проекта. При генерации формирует основной код, который обеспечивает сборку простейшего проекта с захватом и отображением в отдельном окне. В общем удобно.
  11. Ага, это я уже нашел. Закомментировал часть кода. Присвоил значения - константы. Все прекрасно заработало. Вот кусок кода: 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.
  12. Как ни странно да. Хотя при создании консольного проложения с той-же opencv3.0 эта usb-камера открывалась. Подцепил другую - видит! Но при этом появилось две странности. Первая:работает программа и на форме формируется картинка, далее я открываю какое-нибуть окно, программу или диспетчер задач, как программа моя перестает работать и выводится ошибка: Вторая ерунда:при закрытии программы вылетает ошибка: В компиляторе при отладке (после ошибки при закрытии программы) пишет: Поток 0xd38 завершился с кодом 0 (0x0). Программа "[1540] CVPROF.exe" завершилась с кодом 2 (0x2). Я почитал, народ пишет что такая ошибка может возникать если программу под пользователем с ограниченными правами запускаешь. ПРобовал под Администратором - таже петрушка. Если начинаю отлаживать в целом весь проект, то выдает такое сообщение: Походу ругается на строку кода, где IPlImage....
  13. Закоментировал. Ошибка со ссылкой на assert пропала. Теперь просто программа запускается и сразу появляется окно Windows "Прекращена работа программы"...Камера молчит...
  14. Да, инициализировал. Помогло. Нашел еще пару ошибок. Получилось все как в методичке. Удалось собрать проект. Но при запуске .exe возникли проблемы: 1. При запуске открывается форма. Загорается светодиод камеры (т.е. подключение к камере осуществляется), но при этом на форме лишь серый прямоугольник. После нескольких секунд появляется сообщение (см.рис.1). Закрываю программу. 2. Когда пытаюсь запустить снова, появляется окно выбора камеры (см.рис.2). Выбираю камеру. Жму ОК. 3. Тут же прилетает ошибка (см.рис.3) Строка 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); Что это может быть?
  15. 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); }
×