zmienienie algorytmu przetwarzania obrazu, dodanie wyswietlania znacznika,zmiana ustawien xlib,

This commit is contained in:
Mariusz Pacek committed 2013-06-09 22:44:39 +02:00
1 parent 955548024a
commit 8966b17d04
9 files changed
+263 -111

No files matched your search

+145 -81
View File
@@ -9,121 +9,185 @@
#include <opencv2/objdetect/objdetect.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/video/tracking.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include "opencv2/opencv.hpp"
#include <opencv/cv.h>
#include <math.h>
#include <iostream>
#include <stdio.h>
#include <assert.h>
#include <unistd.h>
#include <cvblob.h>
#include "opencv2/opencv.hpp"
#include <opencv/cv.h>
#include "Media.hpp"
#include <iostream>
#include <ctype.h>
#include <stdlib.h>
#include<stdio.h>
#include <math.h>
using namespace cv;
using namespace std;
using namespace cvb;
Mat frame, img1;
Point point;
Point matchLoc;
int drag = 0;
int key = 0;
CvRect rect;
bool done;
int r = 51, g = 99, b = 57;
int rT = 90, gT = 255, bT = 129;
int maxArea=1000, minArea=170;
void setR(int v) {r = v;}
void setG(int v) {g = v;}
void setB(int v) {b = v;}
void setRT(int v) {rT = v;}
void setGT(int v) {gT = v;}
void setBT(int v) {bT = v;}
void mouseHandler(int event, int x, int y, int flags, void* param) {
if (event == CV_EVENT_LBUTTONUP) {
point = Point(x, y);
done = true;
}
}
void setMax(int v){maxArea = v;}
void setMin(int v){minArea = v;}
void matchImage(Mat &img1, Mat &img2) {
Mat imgOutput;
int row = img1.rows - img2.rows + 1;
int col = img1.cols - img2.cols + 1;
imgOutput.create(col, row, CV_32FC1);
matchTemplate(img1, img2, imgOutput, CV_TM_CCOEFF_NORMED);
normalize(imgOutput, imgOutput, 0, 1, NORM_MINMAX, -1, Mat());
Point minLoc, maxLoc;
double minVal, maxVal;
minMaxLoc(imgOutput, &minVal, &maxVal, &minLoc, &maxLoc, Mat());
matchLoc = maxLoc;
}
int main(int, char**) {
VideoCapture cap(0); // open the default camera
if (!cap.isOpened()) // check if we succeeded
return -1;
Media mouse;
bool mouseon = true;
int x, y;
int x, x1, y, y1;
// W H
pair<int,int> res = mouse.getResolution();
pair<int, int> res = mouse.getResolution();
VideoCapture cap(0); // open the default camera
if (!cap.isOpened()) // check if we succeeded
return 0;
namedWindow("result", 1);
namedWindow("output", 1);
namedWindow("bin", 1);
CvBlobs blobs;
CvTracks tracks;
IplImage *red = 0, *tmp = 0,* framee=0,*labelImg=0;
Mat edges, frame;
cap >> frame;
red = cvCreateImage(cvSize(frame.cols, frame.rows), IPL_DEPTH_8U, 1);
tmp = cvCreateImage(cvSize(frame.cols, frame.rows), IPL_DEPTH_8U, 3);
labelImg = cvCreateImage(cvGetSize(red), IPL_DEPTH_LABEL, 1);
framee= cvCreateImage(cvGetSize(red), 8, 3);
cvCreateTrackbar("R","bin",&r,255,setR);
cvCreateTrackbar("G","bin",&g,255,setG);
cvCreateTrackbar("B","bin",&b,255,setB);
cvCreateTrackbar("RT","bin",&rT,255,setRT);
cvCreateTrackbar("BT","bin",&bT,255,setBT);
cvCreateTrackbar("GT","bin",&gT,255,setGT);
cvCreateTrackbar("min","bin",&minArea,1000,setMin);
cvCreateTrackbar("max","bin",&maxArea,100000,setMax);
flip(frame, frame, 1);
for (;;) {
cap >> frame; // gt a new frame from camera
Mat rawTemplate, rawSearch;
while (!done) {
cap >> frame;
flip(frame, frame, 1);
cvtColor(frame, edges, CV_BGR2HSV);
imshow("result", frame);
if (rect.width > 0)
frame = frame(rect);
setMouseCallback("result", mouseHandler, NULL);
imshow("result", frame);
cvWaitKey(10);
}
tmp->imageData = (char*) edges.data;
framee->imageData = (char*) frame.data;
Point p1 = Point(point.x - 20, point.y - 20);
Point p2 = Point(point.x + 20, point.y + 20);
rectangle(frame, p1, p2, CV_RGB(255, 0, 0), 1, 8, 0);
Rect ra = Rect(p1, p2);
Mat imgTemplate = frame(ra);
Point p3 = Point(p1.x - 30, p1.y - 30);
Point p4 = Point(p2.x + 60, p2.y + 60);
Mat searchRegion = frame(Rect(p3, p4));
rawTemplate = imgTemplate = imgTemplate.clone();
rawSearch = searchRegion = searchRegion.clone();
matchImage(searchRegion, imgTemplate);
char key = -1;
Rect solution = Rect(Point(matchLoc.x + p3.x, matchLoc.y + p3.y), Point(matchLoc.x + imgTemplate.cols + p3.x, matchLoc.y +
imgTemplate.rows + p3.y));
while (true) {
cap >> frame;
flip(frame, frame, 1);
Point p1 = Point(matchLoc.x, matchLoc.y);
Point p2 = Point(matchLoc.x + imgTemplate.cols, matchLoc.y + imgTemplate.rows);
imgTemplate = searchRegion.clone();
imgTemplate = imgTemplate(Rect(p1, p2));
searchRegion = frame.clone();
searchRegion = searchRegion(Rect(p3, p4));
matchImage(searchRegion, imgTemplate);
solution = Rect(Point(matchLoc.x + p3.x, matchLoc.y + p3.y), Point(matchLoc.x + imgTemplate.cols + p3.x, matchLoc.y +
imgTemplate.rows + p3.y));
if ((x = solution.x - 50) <= 0)
x = 0;
else
if ((x = solution.x - 50) >= 640)
x = 640;
if ((y = solution.y - 50) <= 0)
y = 0;
else
if ((y = solution.y - 50) >= 480)
y = 480;
if ((x1 = solution.x + solution.width + 50) <= 0)
x1 = 0;
else
if ((x1 = solution.x + solution.width + 50) >= 640)
x1 = 640;
if ((y1 = solution.y + solution.height + 50) <= 0)
y1 = 0;
else
if ((y1 = solution.y + solution.height + 50) >= 480)
y1 = 480;
p3 = Point(x, y);
p4 = Point(x1, y1);
rectangle(frame, p3, p4, Scalar(0, 0, 255), 2, 8, 0);
rectangle(frame, solution, Scalar(255, 0, 0), 2, 8, 0);
x = (int) (solution.x + solution.x + solution.width) / 2;
y = (int) (solution.y + solution.y + solution.height) / 2;
cvInRangeS(tmp, Scalar(r, g, b), Scalar(rT, gT, bT), red);
cvDilate(red, red, NULL, 3);
cvErode(red, red, NULL, 4);
cvDilate(red, red, NULL, 2);
cvLabel(red, labelImg, blobs);
cvFilterByArea(blobs, minArea, maxArea);
cvRenderBlobs(labelImg, blobs, framee, framee, CV_BLOB_RENDER_BOUNDING_BOX);
cvUpdateTracks(blobs, tracks, 200, 5);
cvRenderTracks(tracks, framee, framee, CV_TRACK_RENDER_ID | CV_TRACK_RENDER_BOUNDING_BOX);
for (CvBlobs::const_iterator it = blobs.begin(); it != blobs.end(); ++it) {
x = (int) it->second->centroid.x;
y = (int) it->second->centroid.y;
if (mouseon) {
mouse.setMouse(x/(double)frame.cols*res.second,y/(double)frame.rows*res.first);
}
mouse.setMouse(x / (double) frame.cols * res.second, y / (double) frame.rows * res.first,3);
mouse.drawArc(x / (double) frame.cols * res.second, y / (double) frame.rows * res.first, 3);
imshow("result3", searchRegion);
imshow("result", frame);
imshow("output", imgTemplate);
key = waitKey(1);
if (key == 'q')
break;
}
imshow("output", Mat(framee));
imshow("bin", Mat(red));
char key = (char) waitKey(1);
switch (key) {
case 'a':
mouseon = mouseon ? false : true;
case 'r':
imgTemplate = rawTemplate.clone();
searchRegion = frame.clone();
break;
}
if (key == 'b') break; //exit program
}
destroyAllWindows();
// the camera will be deinitialized automatically in VideoCapture destructor
return 0;
}