+7(960) 250-82-68 info@mirossa.ru


 mirossa        1С           C         PHP       JAVA  


Статьи
 
 

OpenCV. Веб камера. Оптический поток Фарнебака.

(включается камера, в окне отображается поток видео. Через пару секунд в первом окне сохраняется текущий кадр и Открывается второе окно с потоком видео. Применяется функция вычисления оптического потока Фарнебака. В консоль выводятся значения...)

Пакет OpenCV компилировал компилятором i686-w64-mingw32-g++.exe (8.1)
https://ruvid.net/video/how-to-use-opencv-with-with-qt-mingw-on-windows-platform-ZOSu-2Oju-A.html
https://habr.com/post/318846/
CMake : (https://cmake.org/download/) или тут

file "webcam.cpp"

#include <stdio.h>
#include <windows.h>
#include <opencv2/core/core.hpp>
//#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui/highgui.hpp>
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/video/tracking.hpp"
#include <iostream>
#include <string>
using namespace cv;
using namespace std;

//компилируем без флага -mwindows
// компиляция:

// cd "C:\Program Files (x86)\mingw-w64\i686-8.1.0-posix-dwarf-rt_v6-rev0\mingw32\bin"
// i686-w64-mingw32-g++.exe -IC:\OpenCV_sborka\opencv-2.4.13.6_release\install\include\ webcam.cpp 
     -L"C:\OpenCV_sborka\opencv-2.4.13.6_release\install\x86\mingw\lib" -lopencv_core2413.dll
     -lopencv_highgui2413.dll -lopencv_imgproc2413.dll -lopencv_video2413.dll -o webcam2413.exe -mwindows
int main() { SetConsoleCP(1251); // На ввод SetConsoleOutputCP(1251); //На вывод. в CMD шрифт - Lucida Concole // cv::CvCapture * webcam = cv::cvCreateCameraCapture(0); // if(!webcam){ // printf("Ошибка определени¤ камеры."); // return 0; // } // namedWindow( "Display window", CV_WINDOW_AUTOSIZE );// Create a window for display. // //Mat img = imread("2.jpg", -1); // IplImage* img1 = cvLoadImage("2.jpg"); // Mat img = Mat(img1); // if (! img.data) // { // cout << "Cannot open image!" << endl; // waitKey(5500); // return -1; // } // imshow("image", img); // waitKey(5500); // получаем картинку // IplImage* image = cvLoadImage("22.png",1); // // окно дл¤ отображени¤ картинки // cvNamedWindow("original",CV_WINDOW_AUTOSIZE); // // показываем картинку // cvShowImage("original",image); // waitKey(5500); cv::namedWindow("Etalon_Img", cv::WINDOW_AUTOSIZE); //отображаем Эталонный кадр cv::VideoCapture cap; cap.open(0); if(!cap.isOpened()){ std::cerr << "Ошибка при открыти¤ устройства захвата." << std::endl; cv::waitKey(5500); return -1; } //cv::waitKey(5000); cv::Mat etalon, frame, flowUmat; //несколько секунд видео (чтобы включилась камера). �'ерем последний кадр как эталонный. int c; for(c = 0; c < 250 ; c += 1){ cap >> etalon; if(etalon.empty()) break; cv::imshow("Etalon_Img", etalon); if(cv::waitKey(33) >= 0) break; } cvtColor(etalon, etalon, COLOR_BGR2GRAY); //etalone преобразуется в серые оттенки cv::namedWindow("Example3", cv::WINDOW_AUTOSIZE); for(;;){ cap >> frame; if(frame.empty()) break; cv::imshow("Example3", frame); cvtColor(frame, frame, COLOR_BGR2GRAY); // преобразуется в серые оттенки // calculate optical flow !!! нужно крутить настройки параметров этой функции //в include "opencv2/video/tracking.hpp" and -lopencv_vide2413.dll calcOpticalFlowFarneback(etalon, frame, flowUmat, 0.4, 1, 4, 2, 1, 1, 0); if( flowUmat.empty() ) // Check for invalid input { cout << "Could not open or find the image" << std::endl; return -1; } int x,y; double xx = 0,yy = 0; //flowUmat.rows flowUmat.cols for(x = 0; x < flowUmat.rows; x += 1) { for(y = 0; y < flowUmat.cols; y += 1) { const Point2f& fxy = flowUmat.at(x, y); //для теста здесь суммируем все вектора xx+= fxy.x; yy+= fxy.y; //printf("%f / %f; ", fxy.x, fxy.y); выводим значения "потока" каждого пикселя } //printf("\n"); } // //вывод всех значений (сумм для каждого кадра) // //вывод значений смещения пикселя // printf("Total summ = %f / %f;\n", xx, yy); //компилируем без флага -mwindows //ыводим сообщение только если вышли за какую-то границу if((xx > -10000) or (yy > -10000)) printf("Warning! %f / %f;\n", xx, yy); if(cv::waitKey(33) >= 0) break; } printf("Ok"); return 0; }

to be continued...