opencv track image linux
来源:互联网 发布:网络教育多久拿证 编辑:程序博客网 时间:2024/06/08 10:30
//objectTrackingTutorial.cpp//Written by Kyle Hounslow 2013//Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software")//, to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, //and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions://The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.//THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,//FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER //LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS//IN THE SOFTWARE.#include <sstream>#include <string>#include <iostream>//#include <opencv\highgui.h>#include <opencv/cv.h>#include <stdio.h>#include <opencv/highgui.h>#include <opencv2/opencv.hpp>using namespace cv;using namespace std;//initial min and max HSV filter values.//these will be changed using trackbarsint H_MIN = 0;int H_MAX = 256;int S_MIN = 0;int S_MAX = 256;int V_MIN = 0;int V_MAX = 256;//default capture width and heightconst int FRAME_WIDTH = 640;const int FRAME_HEIGHT = 480;//max number of objects to be detected in frameconst int MAX_NUM_OBJECTS=50;//minimum and maximum object areaconst int MIN_OBJECT_AREA = 20*20;const int MAX_OBJECT_AREA = FRAME_HEIGHT*FRAME_WIDTH/1.5;//names that will appear at the top of each windowconst string windowName = "Original Image";const string windowName1 = "HSV Image";const string windowName2 = "Thresholded Image";const string windowName3 = "After Morphological Operations";const string trackbarWindowName = "Trackbars";void on_trackbar( int, void* ){//This function gets called whenever a// trackbar position is changed}string intToString(int number){std::stringstream ss;ss << number;return ss.str();}void createTrackbars(){//create window for trackbars namedWindow(trackbarWindowName,0);//create memory to store trackbar name on windowchar TrackbarName[50];sprintf( TrackbarName, "H_MIN%d", H_MIN);sprintf( TrackbarName, "H_MAX%d", H_MAX);sprintf( TrackbarName, "S_MIN%d", S_MIN);sprintf( TrackbarName, "S_MAX%d", S_MAX);sprintf( TrackbarName, "V_MIN%d", V_MIN);sprintf( TrackbarName, "V_MAX%d", V_MAX);//create trackbars and insert them into window//3 parameters are: the address of the variable that is changing when the trackbar is moved(eg.H_LOW),//the max value the trackbar can move (eg. H_HIGH), //and the function that is called whenever the trackbar is moved(eg. on_trackbar)// ----> ----> ----> createTrackbar( "H_MIN", trackbarWindowName, &H_MIN, H_MAX, on_trackbar ); createTrackbar( "H_MAX", trackbarWindowName, &H_MAX, H_MAX, on_trackbar ); createTrackbar( "S_MIN", trackbarWindowName, &S_MIN, S_MAX, on_trackbar ); createTrackbar( "S_MAX", trackbarWindowName, &S_MAX, S_MAX, on_trackbar ); createTrackbar( "V_MIN", trackbarWindowName, &V_MIN, V_MAX, on_trackbar ); createTrackbar( "V_MAX", trackbarWindowName, &V_MAX, V_MAX, on_trackbar );}void drawObject(int x, int y,Mat &frame){//use some of the openCV drawing functions to draw crosshairs//on your tracked image! //UPDATE:JUNE 18TH, 2013 //added 'if' and 'else' statements to prevent //memory errors from writing off the screen (ie. (-25,-25) is not within the window!)circle(frame,Point(x,y),20,Scalar(0,255,0),2); if(y-25>0) line(frame,Point(x,y),Point(x,y-25),Scalar(0,255,0),2); else line(frame,Point(x,y),Point(x,0),Scalar(0,255,0),2); if(y+25<FRAME_HEIGHT) line(frame,Point(x,y),Point(x,y+25),Scalar(0,255,0),2); else line(frame,Point(x,y),Point(x,FRAME_HEIGHT),Scalar(0,255,0),2); if(x-25>0) line(frame,Point(x,y),Point(x-25,y),Scalar(0,255,0),2); else line(frame,Point(x,y),Point(0,y),Scalar(0,255,0),2); if(x+25<FRAME_WIDTH) line(frame,Point(x,y),Point(x+25,y),Scalar(0,255,0),2); else line(frame,Point(x,y),Point(FRAME_WIDTH,y),Scalar(0,255,0),2);putText(frame,intToString(x)+","+intToString(y),Point(x,y+30),1,1,Scalar(0,255,0),2);}void morphOps(Mat &thresh){//create structuring element that will be used to "dilate" and "erode" image.//the element chosen here is a 3px by 3px rectangleMat erodeElement = getStructuringElement( MORPH_RECT,Size(3,3)); //dilate with larger element so make sure object is nicely visibleMat dilateElement = getStructuringElement( MORPH_RECT,Size(8,8));erode(thresh,thresh,erodeElement);erode(thresh,thresh,erodeElement);dilate(thresh,thresh,dilateElement);dilate(thresh,thresh,dilateElement);}void trackFilteredObject(int &x, int &y, Mat threshold, Mat &cameraFeed){Mat temp;threshold.copyTo(temp);//these two vectors needed for output of findContoursvector< vector<Point> > contours;vector<Vec4i> hierarchy;//find contours of filtered image using openCV findContours functionfindContours(temp,contours,hierarchy,CV_RETR_CCOMP,CV_CHAIN_APPROX_SIMPLE );//use moments method to find our filtered objectdouble refArea = 0;bool objectFound = false;if (hierarchy.size() > 0) {int numObjects = hierarchy.size(); //if number of objects greater than MAX_NUM_OBJECTS we have a noisy filter if(numObjects<MAX_NUM_OBJECTS){for (int index = 0; index >= 0; index = hierarchy[index][0]) {Moments moment = moments((cv::Mat)contours[index]);double area = moment.m00;//if the area is less than 20 px by 20px then it is probably just noise//if the area is the same as the 3/2 of the image size, probably just a bad filter//we only want the object with the largest area so we safe a reference area each//iteration and compare it to the area in the next iteration. if(area>MIN_OBJECT_AREA && area<MAX_OBJECT_AREA && area>refArea){x = moment.m10/area;y = moment.m01/area;objectFound = true;refArea = area;}else objectFound = false;}//let user know you found an objectif(objectFound ==true){putText(cameraFeed,"Tracking Object",Point(0,50),2,1,Scalar(0,255,0),2);//draw object location on screendrawObject(x,y,cameraFeed);}}else putText(cameraFeed,"TOO MUCH NOISE! ADJUST FILTER",Point(0,50),1,2,Scalar(0,0,255),2);}}int main(int argc, char* argv[]){//some boolean variables for different functionality within this//program bool trackObjects = false; bool useMorphOps = false;//Matrix to store each frame of the webcam feedMat cameraFeed;//matrix storage for HSV imageMat HSV;//matrix storage for binary threshold imageMat threshold;//x and y values for the location of the objectint x=0, y=0;//create slider bars for HSV filteringcreateTrackbars();//video capture object to acquire webcam feedVideoCapture capture;//open capture object at location zero (default location for webcam)capture.open(0);//set height and width of capture framecapture.set(CV_CAP_PROP_FRAME_WIDTH,FRAME_WIDTH);capture.set(CV_CAP_PROP_FRAME_HEIGHT,FRAME_HEIGHT);//start an infinite loop where webcam feed is copied to cameraFeed matrix//all of our operations will be performed within this loopwhile(1){//store image to matrixcapture.read(cameraFeed);//convert frame from BGR to HSV colorspacecvtColor(cameraFeed,HSV,COLOR_BGR2HSV);//filter HSV image between values and store filtered image to//threshold matrixinRange(HSV,Scalar(H_MIN,S_MIN,V_MIN),Scalar(H_MAX,S_MAX,V_MAX),threshold);//perform morphological operations on thresholded image to eliminate noise//and emphasize the filtered object(s)if(useMorphOps)morphOps(threshold);//pass in thresholded frame to our object tracking function//this function will return the x and y coordinates of the//filtered objectif(trackObjects)trackFilteredObject(x,y,threshold,cameraFeed);//show frames imshow(windowName2,threshold);imshow(windowName,cameraFeed);imshow(windowName1,HSV);//delay 30ms so that screen can refresh.//image will not appear without this waitKey() commandwaitKey(30);}return 0;}
0 0
- opencv track image linux
- back track linux
- 【opencv学习】 Low-Power Image Recognition Challenge (LPIRC):Track 3 用摄像头从带二维码边框的图片中提取照片及信息的方法
- track
- opencv 2.4 image stitching
- OpenCV iOS - Image Processing
- opencv image filter
- OpenCV Resize image
- 【OpenCV】Image Watch插件
- Opencv Image Filtering 学习
- OpenCV vs scikit-image
- OpenCV运动检测跟踪(blob track)框架组成模块详解
- OpenCV运动检测跟踪(blob track)框架组成模块详解
- OpenCV运动检测跟踪(blob track)框架组成模块详解
- How to Detect and Track Object With OpenCV
- 【OpenCV】图像滤波 Image Filtering
- 【OpenCV】图像滤波 Image Filtering
- OpenCV例程1 Display image
- android 短信管理
- 关于Java为什么配置好环境变量但是不能在命令行cmd运行javac的问题
- 多线程下 ,linux和 windows开发应注意的区别
- Linux内核同步方法
- maven核心,pom.xml详解
- opencv track image linux
- HBase Shell输入命令无法删除问题解决技巧
- KBEngine——消息的使用
- 基于朴素贝叶斯分类器的文本分类算法(C语言)
- 求和求到手软
- effective c++条款13-17 “以对象管理资源”之C++类型转换函数和构造函数
- Node.js中字符串变量和缓存区对象注意细节
- nyoj color the fence
- linux虚拟内存内核参数