2014年2月16日日曜日

指定エリア内のカラー平均グラフの生成

ManyAreaValue.h
--------------------------------

#pragma once
#include "cvbase.h"
#include <vector>

using namespace std;

class Area
{
public:
Area(void);
CvPoint start;
CvPoint end;
int sum[3];
int before[3];
};
class ManyAreaValue :
public CVBase
{
public:
ManyAreaValue(void);
~ManyAreaValue(void);
vector<Area *> areas;
CvPoint pStart;
int speed;

IplImage *graph;

FILE *fp;
cv::VideoCapture cap;
bool mouse;

int count;
int position;
void mouseEvent (int event, int x, int y, int flags, void *param);
void mouseEvent2 (int event, int x, int y, int flags, void *param);
void init(void);
void mainloop(void);

CvScalar createColor(int colorNum);

//void term(void);

void calucurateAreaRGB(IplImage *img);
void printAreaRGB(void);


};



ManyAreaValue.cpp
-----------------------------

#include "ManyAreaValue.h"

void on_mouse (int event, int x, int y, int flags, void *param = NULL);
void on_mouse2 (int event, int x, int y, int flags, void *param = NULL);

Area::Area(void)
{
for (int j=0;j<3;j++){
this->sum[j] = -1;
}

}

ManyAreaValue::ManyAreaValue(void)
{
count = 0;
graph = cvCreateImage( cvSize( 1200, 255*4), IPL_DEPTH_8U, 3);
for (int i=0;i<4;i++){
cvLine (graph, cvPoint(0,255*i), cvPoint(1200,255*i), CV_RGB (    0,  0,  0), 1, CV_AA, 0);
cvLine (graph, cvPoint(0,255*i+100), cvPoint(1200,255*i+100), CV_RGB (    100,  100,  100), 1, CV_AA, 0);
cvLine (graph, cvPoint(0,255*i+200), cvPoint(1200,255*i+200), CV_RGB (    100,  100,  100), 1, CV_AA, 0);
}
}

ManyAreaValue::~ManyAreaValue(void)
{
}

void ManyAreaValue::mouseEvent (int event, int x, int y, int flags, void *param)
{
switch (event) {
case CV_EVENT_MOUSEMOVE:
break;
case CV_EVENT_LBUTTONDOWN:
pStart.x = x;
pStart.y = y;
break;
case CV_EVENT_LBUTTONUP:
Area *area = new Area();
CvPoint pEnd;
area->end.x = x;
area->end.y = y;
area->start = pStart;
areas.push_back(area);
break;
}
}

void ManyAreaValue::mouseEvent2 (int event, int x, int y, int flags, void *param)
{
switch (event) {
case CV_EVENT_MOUSEMOVE:
break;
case CV_EVENT_LBUTTONDOWN:
break;
case CV_EVENT_LBUTTONUP:
int setPos = (int)position/1200;
setPos += x;
count = x;
position = setPos;
cvSetCaptureProperty( this->capture, CV_CAP_PROP_POS_FRAMES, setPos*speed );
//frameNum = x*10;
break;
}
}

void ManyAreaValue::calucurateAreaRGB(IplImage *img)
{
for (int i=0;i<areas.size();i++){
uchar p[3];
for (int j=0;j<3;j++){
areas[i]->before[j] = areas[i]->sum[j] ;
areas[i]->sum[j] = 0;
}
int areaSize = (areas[i]->end.y-areas[i]->start.y) * (areas[i]->end.x-areas[i]->start.x);
for (int y = areas[i]->start.y; y < areas[i]->end.y; y++) {
for (int x = areas[i]->start.x; x < areas[i]->end.x; x++) {
for (int j=0;j<3;j++){
p[0] = img->imageData[img->widthStep * y + x * 3 + 2 - j];
areas[i]->sum[j] += p[0];
}
}
}
for (int j=0;j<3;j++){
areas[i]->sum[j] /= areaSize;
}
}
}

CvScalar ManyAreaValue::createColor(int colorNum)
{
if (colorNum == 0){
return CV_RGB (  255,    0,  0);
}else if(colorNum == 1){
return CV_RGB (    0,  255,  0);
}else if (colorNum == 2){
return CV_RGB (    0,    0, 255);
}
return CV_RGB (    255,  255, 255);
}

void ManyAreaValue::printAreaRGB(void)
{
double msec = cvGetCaptureProperty(this->capture,CV_CAP_PROP_POS_MSEC);
fprintf(this->fp,"%lf,",msec);
for (int i=0;i<areas.size();i++){
for (int j=0;j<3;j++){
if (areas[i]->before[j] !=-1){

cvLine(graph,
cvPoint(count-1,255*i),
cvPoint(count,255*i+255),
CV_RGB (    0,  0,  0),
2, CV_AA, 0);
fprintf(this->fp,"%d,",areas[i]->sum[j]);
cvLine (graph,
cvPoint(count-1,255*i+areas[i]->before[j]),
cvPoint(count,255*i+areas[i]->sum[j]),
createColor(j),
2, CV_AA, 0);
}
}
}
fprintf(this->fp,"\n");
cvShowImage ("Graph",this->graph);
}

void ManyAreaValue::init(void)
{
FILE *initfp;
initfp = fopen("ini/ManyAreaValue.txt", "r");
char fileName[256];
int mode;
fscanf(initfp,"%d",&mode);
if (mode == 1){
fscanf(initfp,"%s",&fileName);
fscanf(initfp,"%d",&speed);
this->capture = cvCaptureFromFile(fileName);//"C:\\Users\\aiko\\Documents\\Visual Studio 2010\\Projects\\OpenCVBase\\1_01_H_131129153000.avi");
int areaNum;
fscanf(initfp,"%d",&areaNum);
for (int i=0;i<areaNum;i++){
Area *area = new Area();
fscanf(initfp,"%d",&area->start.x);
fscanf(initfp,"%d",&area->start.y);
fscanf(initfp,"%d",&area->end.x);
fscanf(initfp,"%d",&area->end.y);
this->areas.push_back(area);
}
}else{
this->capture = this->fromCamera();
}

cvNamedWindow( "Capture", 1 );
cvSetMouseCallback ("Capture", on_mouse);
cvNamedWindow( "Graph", 1 );
cvMoveWindow("Graph",0,0);

cvSetMouseCallback ("Capture", on_mouse);
this->fp = fopen("nyan.txt","w");
double fps = cvGetCaptureProperty(this->capture,CV_CAP_PROP_FPS);

}

void ManyAreaValue:: mainloop(void)
{
while (1) {
count++;
position++;
if(count>1200)count = 0;
for (int i=0;i<speed;i++){
this->frame = cvQueryFrame (this->capture);
}
if ( this->frame == NULL ){
cvSetCaptureProperty( this->capture, CV_CAP_PROP_POS_FRAMES, 0.0 );
this->frame = cvQueryFrame(this->capture);
continue;
}
if (this->areas.size() > 0){
this->calucurateAreaRGB(this->frame);
this->printAreaRGB();
for(int i=0;i<this->areas.size();i++)
this->drawLine(this->frame,this->areas[i]->start,this->areas[i]->end,CV_RGB (255, 0, 0),2);
}
cvShowImage ("Capture",this->frame);
ch = cvWaitKey ( 1 ); // 0 はディレイ時間 (ミリ秒単位)
if (ch == '\x1b') {
// ESC キー
break;
    }
  }
}

Camshift(物体追従)

ManyCamShiftAreaDesition.h
-------------------------------------

#pragma once
#include "cvbase.h"
#include "opencv2/video/tracking.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"

#include <iostream>
#include <ctype.h>
#include <stdio.h>

using namespace cv;
using namespace std;
class CamShiftResult
{
public:
int frameNum;
RotatedRect trackBox;
};
class CamShiftArea
{
public:
CamShiftArea(void);
CamShiftArea(int width,int height);
~CamShiftArea(void);
Rect selection;
bool selectObject;
int trackObject;
Mat histimg;
Mat backproj;
Mat hist;
Rect trackWindow;
Mat positionData;
Mat graph;
int beforeAreaNum;
int beforeTime;
FILE *csvFile;
vector<Point2f> points;
vector<CamShiftResult *> results;
int getTimePoint(int x,int y);
int getAreaNum(Point2f p);
void drawGraph(Mat graph,int time,int areaNum);
void drawLines(Mat image,cv::Scalar color,bool colorFlag);
void drawTarget(Mat image,cv::Scalar color,int num);
void drawArea(Mat image);
void calucurateCamShit(Mat image,int num,int nowTime,int _vmin, int _vmax ,int smin,bool backprojMode);

};
class ManyCamShiftAreaDesition:
public CVBase
{
public:
ManyCamShiftAreaDesition(void);
~ManyCamShiftAreaDesition(void);void init(void);
void mainloop(void);
void term(void);
void mouseEvent (int event, int x, int y, int flags, void *param);
void keyEvent(char c);
void drawNowPoint(Mat graph,int num);

void startCreateArea(int x, int y);
void endCreateArea(int x, int y);
void timeShift(int x, int y);
void createWork(int x,int y);

int speed;
bool paused;
int targetArea;
int waitSprrd;

vector<CamShiftArea *> areas;
CamShiftArea *tmpArea;

Mat image;
Mat positionData;
int caluculatedNum;

bool backprojMode;
bool showHist;
Point origin;
Rect selection;
int vmin;
int vmax;
int smin;
VideoCapture cap;

vector<Point2f> tmpPoints;
};




ManyCamShiftAreaDesition.cpp
---------------------------------------

#include "ManyCamShiftAreaDesition.h"

void on_mouse (int event, int x, int y, int flags, void *param = NULL);
Scalar convertNum2Scalar(int num)
{
num++;
printf("%d,%d,%d\n",((int)num%(255*255))%255, (int)((int)num%(255*255))/255, (int)num/255/255);
return Scalar(((int)num%(255*255))%255, (int)((int)num%(255*255))/255, (int)num/255/255);
}

Scalar convertSmallNum2Scalar(int num)
{
int r,g,b;
if(num == 0){
r = 255;
g = 100;
b = 100;
}else if(num == 1){
r = 255;
g = 255;
b = 100;
}else if(num == 2){
r = 255;
g = 100;
b = 255;
}else if(num == 3){
r = 100;
g = 255;
b = 100;
}else if(num == 4){
r = 100;
g = 255;
b = 255;
}else if(num == 5){
r = 100;
g = 100;
b = 255;
}else{
r = 255;
g = 255;
b = 255;
}
return Scalar(r,g,b);
}

Scalar convertMidiumNum2Scalar(int num)
{
int r,g,b;
num %= (255*6);
if(num <255){
r = 255;
g = num;
b = 0;
}else if(num < 255 * 2){
r = 255-(num - 255 * 1);
g = 255;
b = 0;
}else if(num < 255 *3){
r = 0;
g = 255;
b = num - 255 * 2;
}else if(num < 255*4){
r = 0;
g = 255-(num - 255 * 3);
b = 255;
}else if(num < 255*5){
r = num - 255 * 4;
g = 0;
b = 255;
}else if(num < 255 * 6){
r = 255;
g = 0;
b = 255-(num - 255 * 5);
}
return Scalar(r,g,b);
}

int convertScalar2Num(int r,int g,int b)
{
return b * 255 * 255 + g * 255 + r-1;
}

CamShiftArea::CamShiftArea(void)
{
histimg = Mat::zeros(200, 320, CV_8UC3);
selectObject = false;
trackObject = 0;
}

CamShiftArea::CamShiftArea(int width,int height)
{
histimg = Mat::zeros(200, 320, CV_8UC3);
positionData = Mat::zeros(width, height, CV_8UC3);
selectObject = false;
trackObject = 0;
positionData = Mat::zeros(width, height, CV_8UC3);
beforeAreaNum = -1;
beforeTime = 0;

graph =  Mat::zeros( 10*10*5,1200, CV_8UC3);
}

CamShiftArea::~CamShiftArea(void)
{
}

void CamShiftArea::calucurateCamShit(Mat image,int num,int nowTime,int _vmin, int _vmax ,int smin,bool backprojMode)
{//http://iwaki2009.blogspot.jp/2013/02/opencv_68.html
int hsize = 16;
    float hranges[] = {0,180};
    const float* phranges = hranges;

Mat hsv,mask,hue;;
cv::cvtColor(image, hsv, CV_BGR2HSV);
if( trackObject  )//&& caluculatedNum < nowNum
{
/*============2 マスク画像の作成============*/
inRange(hsv,
Scalar(0, smin, MIN(_vmin,_vmax)),
Scalar(180, 256, MAX(_vmin, _vmax)),
mask);

/*============3 RGBからHSV変換し、H画像の取得============*/
int ch[] = {0, 0};
hue.create(hsv.size(), hsv.depth());
mixChannels(&hsv, 1, &hue, 1, ch, 1);

/*============4 指定エリアのヒストグラムを計算、正規化、描画============*/
if( trackObject < 0 ){
Mat roi(hue, selection), maskroi(mask, selection);
calcHist(&roi, 1, 0, maskroi, hist, 1, &hsize, &phranges);
normalize(hist, hist, 0, 255, CV_MINMAX);

trackWindow = selection;
trackObject = 1;

histimg = Scalar::all(0);
int binW = histimg.cols / hsize;
Mat buf(1, hsize, CV_8UC3);
for( int i = 0; i < hsize; i++ ){
buf.at<Vec3b>(i) = Vec3b(saturate_cast<uchar>(i*180./hsize), 255, 255);
}
cv::cvtColor(buf, buf, CV_HSV2BGR);

for( int i = 0; i < hsize; i++ ){
int val = saturate_cast<int>(hist.at<float>(i)*histimg.rows/255);
rectangle( histimg, Point(i*binW,histimg.rows),
Point((i+1)*binW,histimg.rows - val),
Scalar(buf.at<Vec3b>(i)), -1, 8 );
}
}


/*============5 ヒストグラムを元にBackProjectionを計算============*/
calcBackProject(&hue, 1, 0, hist, backproj, &phranges);

/*============6 計算結果にマスクをかける============*/
backproj &= mask;

/*============7 CamShiftにより対象エリアの計算============*/
RotatedRect trackBox = cv::CamShift(backproj, trackWindow,
TermCriteria( CV_TERMCRIT_EPS | CV_TERMCRIT_ITER, 10, 1 ));

/*============8 次回探索枠の計算============*/
if( trackWindow.area() <= 1 ){
int cols = backproj.cols, rows = backproj.rows, r = (MIN(cols, rows) + 5)/6;
trackWindow = Rect(trackWindow.x - r, trackWindow.y - r,
trackWindow.x + r, trackWindow.y + r) &
Rect(0, 0, cols, rows);
}
if( backprojMode ){
cv::cvtColor( backproj, image, CV_GRAY2BGR );
}

/*============現在エリアの探索============*/
int areaNum=this->getAreaNum(trackBox.center);

/*============チャートの描画============*/
if (areaNum != -1)
this->drawGraph(graph,num,areaNum);

/*============エリア移動時はCSVに出力============*/
if(areaNum != beforeAreaNum){
fprintf(csvFile,"%d,%d\n",areaNum,nowTime-beforeTime);
beforeTime = nowTime;
beforeAreaNum = areaNum;
}

/*============探索結果を保存============*/
CamShiftResult *result = new CamShiftResult();
result->frameNum = num;
result->trackBox = trackBox;
this->results.push_back(result);

/*============軌跡を描画============*/
if (this->results.size() > 1){
cv::line(positionData,
this->results[this->results.size()-1]->trackBox.center,
this->results[this->results.size()-2]->trackBox.center,
convertNum2Scalar(num),8,8,0);
}
}
}

int CamShiftArea::getAreaNum(Point2f p)
{
for (int i=0;i<(int)points.size()/4;i++){
int targeti = i * 4;
int vec1[2];
vec1[0] = points[targeti+1].x -points[targeti].x;
vec1[1] = points[targeti+1].y -points[targeti].y;
int vec2[2];
vec2[0] = p.x -points[targeti].x;
vec2[1] = p.y -points[targeti].y;
if (vec1[0]*vec2[0]+vec1[1]*vec2[1] > 0.0){
targeti++;
vec1[0] = points[targeti+1].x -points[targeti].x;
vec1[1] = points[targeti+1].y -points[targeti].y;
vec2[0] = p.x -points[targeti].x;
vec2[1] = p.y -points[targeti].y;
if (vec1[0]*vec2[0]+vec1[1]*vec2[1] > 0.0){
targeti++;
vec1[0] = points[targeti+1].x -points[targeti].x;
vec1[1] = points[targeti+1].y -points[targeti].y;
vec2[0] = p.x -points[targeti].x;
vec2[1] = p.y -points[targeti].y;
if (vec1[0]*vec2[0]+vec1[1]*vec2[1] > 0.0){
targeti++;
vec1[0] = points[targeti-3].x -points[targeti].x;
vec1[1] = points[targeti-3].y -points[targeti].y;
vec2[0] = p.x -points[targeti].x;
vec2[1] = p.y -points[targeti].y;
if (vec1[0]*vec2[0]+vec1[1]*vec2[1] > 0.0){
return i;
}
}
}
}
}
return -1;

}

void CamShiftArea::drawGraph(Mat graph,int time,int areaNum)
{
cv::line(graph,cvPoint(time%1200,(int)(time/1200) *10*10+ areaNum*10),cvPoint(time%1200,(int)(time/1200) *10*10+ areaNum*10+10),convertMidiumNum2Scalar(time) , 1, CV_AA, 0);

}

void CamShiftArea::drawLines(Mat image,cv::Scalar color,bool colorFlag)
{
for (int i = 1;i < results.size();i++){
if(colorFlag){
color = convertMidiumNum2Scalar(results[i]->frameNum);
cv::line(image,results[i-1]->trackBox.center,results[i]->trackBox.center,color,1,8,0);
}else{
cv::line(image,results[i-1]->trackBox.center,results[i]->trackBox.center,color,1,8,0);
}
}


}

void CamShiftArea::drawTarget(Mat image,cv::Scalar color,int num)
{
for (int i = 0;i < results.size();i++){
if(results[i]->frameNum == num){
ellipse( image, results[i]->trackBox, color, 3, CV_AA );
}
}
return;
}

void CamShiftArea::drawArea(Mat image)
{
int areaNum = 0;
for (int i = 1;i < points.size();i++){
Scalar color = convertMidiumNum2Scalar(areaNum*50);
areaNum++;
cv::line(image,points[i-1],points[i],color,3,8,0);
i++;
if(i < points.size()){
cv::line(image,points[i-1],points[i],color,3,8,0);
i++;
}
if(i < points.size()){
cv::line(image,points[i-1],points[i],color,3,8,0);
cv::line(image,points[i-3],points[i],color,3,8,0);
i++;
}
}
}

int CamShiftArea::getTimePoint(int x,int y)
{
cv::Vec3b bgr = positionData.at<cv::Vec3b>(y,x);
printf("%d,%d,%d\n",bgr[0],bgr[1],bgr[2]);
if(bgr[0] == 0 && bgr[1] == 0 && bgr[2]==0)return -1;
int num = convertScalar2Num(bgr[0],bgr[1],bgr[2]);
return num;
}

ManyCamShiftAreaDesition::ManyCamShiftAreaDesition(void)
{
backprojMode = false;
showHist = true;
vmin = 10;
vmax = 256;
smin = 30;
caluculatedNum = -1;
targetArea = -1;
}

ManyCamShiftAreaDesition::~ManyCamShiftAreaDesition(void)
{
}

void ManyCamShiftAreaDesition::startCreateArea(int x, int y)
{
origin = Point(x,y);
tmpArea = new CamShiftArea( image.rows, image.cols);
tmpArea->selection = Rect(x,y,0,0);
}

void ManyCamShiftAreaDesition::endCreateArea(int x, int y)
{
tmpArea->selection.x = MIN(x, origin.x);
tmpArea->selection.y = MIN(y, origin.y);
tmpArea->selection.width = std::abs(x - origin.x);
tmpArea->selection.height = std::abs(y - origin.y);
tmpArea->selection &= Rect(0, 0, image.cols, image.rows);
if( tmpArea->selection.width > 0 && tmpArea->selection.height > 0 ){
tmpArea->trackObject = -1;
tmpArea->beforeTime = cap.get(CV_CAP_PROP_POS_MSEC );
char hoge[256];
sprintf(hoge,"ManChart%d.csv",areas.size());
tmpArea->csvFile = fopen(hoge,"w");
targetArea = 0;
if (areas.size() == 0){
for (int i=0;i<this->tmpPoints.size();i++){
tmpArea->points.push_back(this->tmpPoints[i]);
}
}
areas.push_back(tmpArea);
}else{
delete tmpArea;
}
}

void ManyCamShiftAreaDesition::timeShift(int x, int y)
{
if(targetArea > -1 && targetArea < areas.size()){
int num = areas[targetArea]->getTimePoint(x,y);
if (num > 0)cap.set(CV_CAP_PROP_POS_FRAMES ,(double)num);
}
}

void ManyCamShiftAreaDesition::createWork(int x,int y)
{
areas[targetArea]->points.push_back(cvPoint(x,y));
}

void ManyCamShiftAreaDesition::mouseEvent (int event, int x, int y, int flags, void *param)
{
    switch( event )
    {
case CV_EVENT_LBUTTONDOWN:
this->startCreateArea(x,y);
break;
case CV_EVENT_LBUTTONUP:
this->endCreateArea(x,y);
   break;
case CV_EVENT_RBUTTONUP:
if (flags & CV_EVENT_FLAG_ALTKEY){
this->timeShift(x,y);
}else{
this->createWork(x,y);
}
   break;
    }
}

void ManyCamShiftAreaDesition::keyEvent(char c)
{
switch(c){
case 'b':
backprojMode = !backprojMode;
break;
        case 'h':
            showHist = !showHist;
            if( !showHist )
                destroyWindow( "Histogram" );
            else
                namedWindow( "Histogram", 1 );
            break;
        case 'p':
            paused = !paused;
            break;
case 'n': //←
            targetArea--;
if (targetArea == -1){
targetArea = areas.size()-1;
}
            break;
case 'm': //⇒
            targetArea++;
if (areas.size() == targetArea){
targetArea = 0;
}
            break;
case 's':
            cv::imwrite("hoge.jpg",image);
cv::imwrite("positionData.jpg",positionData);
            break;
case 'q':
cv::imwrite("positionData.jpg",positionData);
            break;
case 'z':
areas.pop_back();
            break;
        default:
            break;
}
}

void ManyCamShiftAreaDesition::drawNowPoint(Mat graph,int time)
{
cv::line(graph,cvPoint(time%1200,(int)(time/1200) *10*10+ 0),cvPoint(time%1200,(int)(time/1200) *10*10+ 100),Scalar(255,255,255) , 1, CV_AA, 0);
}

void ManyCamShiftAreaDesition::init(void)
{
FILE *initfp;
initfp = fopen("ini/CamShift.txt", "r");
char fileName[256];
int mode;
fscanf(initfp,"%d",&mode);
if (mode == 1){
fscanf(initfp,"%s",&fileName);
fscanf(initfp,"%d",&speed);
this->cap.open(fileName);
int areaNum;
fscanf(initfp,"%d",&areaNum);
for(int i=0;i<areaNum;i++){
for(int j=0;j<4;j++){
int x,y;
fscanf(initfp,"%d",&x);
fscanf(initfp,"%d",&y);
this->tmpPoints.push_back(cvPoint(x,y));
}
}
}else{
cap.open(0);
}

cvNamedWindow( "Capture", 1 );
cvSetMouseCallback ("Capture", on_mouse);
}

void ManyCamShiftAreaDesition::mainloop(void)
{
    Rect trackWindow;
    int hsize = 16;
    float hranges[] = {0,180};
    const float* phranges = hranges;
this->waitSprrd = 10;

namedWindow( "Histogram", 0 );
    createTrackbar( "Vmin", "Capture", &vmin, 256, 0 );
    createTrackbar( "Vmax", "Capture", &vmax, 256, 0 );
    createTrackbar( "Smin", "Capture", &smin, 256, 0 );
    createTrackbar( "SkipSpeed", "Capture", &speed, 10, 0 );
createTrackbar( "WaitSpeed", "Capture", &this->waitSprrd, 50, 0 );

    Mat frame, histimg = Mat::zeros(200, 320, CV_8UC3),backproj,hist;
    paused = true;
cap >> frame;
frame.copyTo(positionData);
speed = 1;
   
for(;;)
    {
        if( !paused )
        {
cap >> frame;
for(int i=0;i<speed;i++){
cap >> frame;
}
            if( frame.empty() ){
                break;
}
        }

        frame.copyTo(image);
int nowNum = cap.get(CV_CAP_PROP_POS_FRAMES );
int nowTime = cap.get(CV_CAP_PROP_POS_MSEC );

if( !paused ){
if( caluculatedNum < nowNum){
for (int i=0;i<this->areas.size();i++){
areas[i]->calucurateCamShit(image,nowNum,nowTime,vmin,vmax,smin,backprojMode);
}
caluculatedNum = nowNum;
}
}
if( this->areas.size() > 0 ){
            paused = false;
}
       
     

for (int i=0;i<this->areas.size();i++) {
if (targetArea == i){
areas[i]->drawLines(image,convertSmallNum2Scalar(i),true);
areas[i]->drawArea(image);

Mat showGraph = areas[i]->graph.clone();
this->drawNowPoint(showGraph,nowNum);

imshow( "Graph", showGraph );
}else{
areas[i]->drawLines(image,convertSmallNum2Scalar(i),false);
}
areas[i]->drawTarget(image,convertSmallNum2Scalar(i),nowNum);

}

        imshow( "Capture", image );
        imshow( "Histogram", histimg );
if (this->waitSprrd == 0)this->waitSprrd=1;

char c = (char)waitKey(this->waitSprrd);
if( c == 27 ){
cv::imwrite("positionData.jpg",positionData);
for (int i=0;i<this->areas.size();i++) {
char hoge[256];
sprintf(hoge,"metyo%d.jpg",i);
cv::imwrite(hoge,this->areas[i]->positionData);
fclose(areas[i]->csvFile);
}
break;
}
this->keyEvent(c);
    }
}

void ManyCamShiftAreaDesition::term(void)
{
}

OpenCVプログラムベース

・リンカの入力にてheaderを設定


Main.cpp
--------------------------------------------------------
#include "CVBase.h"
#include <ctype.h>
#include <stdio.h>

CVBase *base;


/* コールバック関数 */
void on_mouse (int event, int x, int y, int flags, void *param = NULL)
{
base->mouseEvent(event,x,y,flags,param);
}
/* コールバック関数 */
void on_mouse2 (int event, int x, int y, int flags, void *param = NULL)
{
base->mouseEvent2(event,x,y,flags,param);
}

int main (int argc, char **argv)
{
int mode;
if (argc == 1){
FILE *fp;
fp = fopen("ini/mode.txt", "r");
fscanf(fp,"%d",&mode);
mode = 11;
}else if(argc == 2){
mode=atoi(argv[1]);
}
switch(mode){
case 0:
base = new CVBase();
break;
default:
base = new CVBase();
break;
}

base->init();
base->mainloop();
base->term();


  return 0;
}


OpenCVheader.h
--------------------------------------------------------
// バージョン取得
#define CV_VERSION_STR CVAUX_STR(CV_MAJOR_VERSION) CVAUX_STR(CV_MINOR_VERSION) CVAUX_STR(CV_SUBMINOR_VERSION)

// ビルドモード
#ifdef _DEBUG
#define CV_EXT_STR "d.lib"
#else
#define CV_EXT_STR ".lib"
#endif

// ライブラリのリンク(不要な物はコメントアウト)
#pragma comment(lib, "C:\\OpenCV2.4.5\\opencv\\build\\x86\\vc10\\lib\\opencv_core"            CV_VERSION_STR CV_EXT_STR)
#pragma comment(lib, "C:\\OpenCV2.4.5\\opencv\\build\\x86\\vc10\\lib\\opencv_highgui"        CV_VERSION_STR CV_EXT_STR)
#pragma comment(lib, "C:\\OpenCV2.4.5\\opencv\\build\\x86\\vc10\\lib\\opencv_imgproc"  CV_VERSION_STR CV_EXT_STR)
#pragma comment(lib, "C:\\OpenCV2.4.5\\opencv\\build\\x86\\vc10\\lib\\opencv_calib3d"  CV_VERSION_STR CV_EXT_STR)
//#pragma comment(lib, "opencv_gpu"   CV_VERSION_STR CV_EXT_STR)
#pragma comment(lib, "C:\\OpenCV2.4.5\\opencv\\build\\x86\\vc10\\lib\\opencv_video"   CV_VERSION_STR CV_EXT_STR)
#pragma comment(lib, "C:\\OpenCV2.4.5\\opencv\\build\\x86\\vc10\\lib\\opencv_objdetect"  CV_VERSION_STR CV_EXT_STR)
#pragma comment(lib, "C:\\OpenCV2.4.5\\opencv\\build\\x86\\vc10\\lib\\opencv_features2d" CV_VERSION_STR CV_EXT_STR)
//#pragma comment(lib, "opencv_flann"   CV_VERSION_STR CV_EXT_STR)
//#pragma comment(lib, "opencv_ffmpeg"  CV_VERSION_STR CV_EXT_STR)
//#pragma comment(lib, "opencv_ts"   CV_VERSION_STR CV_EXT_STR)
//#pragma comment(lib, "opencv_contrib"  CV_VERSION_STR CV_EXT_STR)
//#pragma comment(lib, "opencv_ml"   CV_VERSION_STR CV_EXT_STR)
//#pragma comment(lib, "opencv_legacy"  CV_VERSION_STR CV_EXT_STR)



CVBase.h
--------------------------------------------------------
#pragma once

#include "opencv2/opencv.hpp"
#include "OpenCVheader.h"

class CVBase
{
public:
CVBase(void);
~CVBase(void);

CvCapture *capture;
IplImage *frame;
int ch;
CvCapture *fromFile(char *FileName);
CvCapture *fromCamera(void);
virtual void init(void);
virtual void mainloop(void);
virtual void term(void);
virtual void mouseEvent (int event, int x, int y, int flags, void *param);
virtual void mouseEvent2 (int event, int x, int y, int flags, void *param);
void drawLine(IplImage *image,CvPoint pt1,CvPoint pt2,CvScalar rcolor,int width);
virtual void copyArea(IplImage *img ,IplImage *areaImg,CvPoint start,CvPoint end);

};



CVBase.cpp
--------------------------------------------------------
#include "CVBase.h"
#include <stdio.h>

void on_mouse (int event, int x, int y, int flags, void *param = NULL);

CVBase::CVBase(void)
{
}

CVBase::~CVBase(void)
{
}
void CVBase::mouseEvent (int event, int x, int y, int flags, void *param)
{
switch (event) {
case CV_EVENT_MOUSEMOVE:
break;
case CV_EVENT_LBUTTONDOWN:
break;
case CV_EVENT_LBUTTONUP:
break;
}
}
void CVBase::mouseEvent2 (int event, int x, int y, int flags, void *param)
{
switch (event) {
case CV_EVENT_MOUSEMOVE:
break;
case CV_EVENT_LBUTTONDOWN:
break;
case CV_EVENT_LBUTTONUP:
break;
}
}
void CVBase::drawLine(IplImage *image,CvPoint pt1,CvPoint pt2,CvScalar rcolor,int width)
{
//CvScalar rcolor = CV_RGB (255, 0, 0);
cvRectangle (image, pt1, pt2, rcolor, width, CV_AA, 0);
}
void CVBase::copyArea(IplImage *img ,IplImage *areaImg,CvPoint start,CvPoint end)
{
uchar p[3];
int hoge[3] ={0,0,0};
for (int y = 0; y < -end.y+start.y; y++) {
for (int x = 0; x < end.x-start.x; x++) {
int imgX = start.x + x;
int imgY = end.y + y;
p[0] = img->imageData[img->widthStep * imgY + imgX * 3];        // B
p[1] = img->imageData[img->widthStep * imgY + imgX * 3 + 1];    // G
p[2] = img->imageData[img->widthStep * imgY + imgX * 3 + 2]; // R
hoge[0]+=p[0];
hoge[1]+=p[1];
hoge[2]+=p[2];
areaImg->imageData[areaImg->widthStep * (areaImg->height-y) + x * 3] = p[0];
areaImg->imageData[areaImg->widthStep * (areaImg->height-y) + x * 3 + 1] = p[1];
areaImg->imageData[areaImg->widthStep * (areaImg->height-y) + x * 3 + 2] = p[2];
}
}
}
CvCapture *CVBase::fromFile(char *FileName)
{
return cvCaptureFromFile(FileName);//"C:\\Users\\aiko\\Documents\\Visual Studio 2010\\Projects\\OpenCVBase\\1_01_H_131129153000.avi");
}
CvCapture *CVBase::fromCamera(void)
{
return cvCreateCameraCapture (0);
}
void CVBase::init(void)
{

this->capture = cvCaptureFromFile("movie/2_03_R_131126171500.avi");//"C:\\Users\\aiko\\Documents\\Visual Studio 2010\\Projects\\OpenCVBase\\1_01_H_131129153000.avi");

cvNamedWindow( "Capture", 1 );
cvSetMouseCallback ("Capture", on_mouse);

double fps = cvGetCaptureProperty(this->capture,CV_CAP_PROP_FPS);

}
void CVBase:: mainloop(void)
{
while (1) {
this->frame = cvQueryFrame (this->capture);
if ( this->frame == NULL ){
cvSetCaptureProperty( this->capture, CV_CAP_PROP_POS_FRAMES, 0.0 );
this->frame = cvQueryFrame(this->capture);
continue;
}
cvShowImage ("Capture",this->frame);
ch = cvWaitKey ( 1 ); // 0 はディレイ時間 (ミリ秒単位)
if (ch == '\x1b') {
// ESC キー
break;
    }
  }
}
void CVBase::term(void)
{
cvReleaseCapture(& this->capture);
cvDestroyWindow("Capture");
}

2014年2月15日土曜日

gmailからメールを送る

・コンパイルコマンド
set CLASSPATH=C:\java_Project\SendMail\javamail-1.4.5\mail.jar;C:\java_Project\SendMail\jaf-1.1.1\activation.jar;
javac SendMail.java
・同一フォルダ内にjavamail-1.4.5とjaf-1.1.1を置く
・パスワードを記載

import java.security.Security;
import java.util.Date;
import java.util.Properties;

import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.UnknownServiceException;

import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;

import javax.mail.Multipart;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.mail.internet.MimeUtility;

public class SendMail {
private Session session;
public SendMail() {
Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
final String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory";
/* property set */
Properties props = System.getProperties();
props.setProperty("mail.smtp.host","smtp.gmail.com");
props.setProperty("mail.smtp.socketFactory.class",SSL_FACTORY);
props.setProperty("mail.smtp.socketFactory.fallback","false");
props.setProperty("mail.smtp.port","465");
props.setProperty("mail.smtp.socketFactory.port","465");
props.put("mail.smtp.auth","true");

session = Session.getDefaultInstance(props,new Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication("sgr.ukase@gmail.com","PassWord");
}
});
}


public boolean send(String email,String title,String body) {
boolean sendCheck = true;

try {
MimeMessage mimeMessage = new MimeMessage(session);
/* 送信元メールアドレスと送信者名を指定 */
mimeMessage.setFrom(new InternetAddress("sgr.ukase@gmail.com","送信者欄に表示する名前指定","iso-2022-jp"));
/* 送信先メールアドレスを指定 */
mimeMessage.setRecipients(Message.RecipientType.TO,email);
/* メールのタイトルを指定 */
mimeMessage.setSubject(title,"iso-2022-jp");
/* メールの内容を指定 */
mimeMessage.setText(body,"iso-2022-jp");

// related
Multipart relatedPart = new MimeMultipart("mixed");

// alternative
MimeBodyPart alternativeBodyPart = new MimeBodyPart();
Multipart alternativePart = new MimeMultipart("alternative");
alternativeBodyPart.setContent(alternativePart);
relatedPart.addBodyPart(alternativeBodyPart);

// text mail
MimeBodyPart textBodyPart = new MimeBodyPart();
textBodyPart.setDataHandler(new DataHandler(new TextBinaryDataSource(
"gmail経由でi.softbank.jp向けメール送信テスト[:1025:][:0105:]".getBytes(),
"utf-8", "plain", Emoji.Mode.SOFTBANK)));
textBodyPart.setHeader("Content-Transfer-Encoding", "base64");
alternativePart.addBodyPart(textBodyPart);

// html mail
MimeBodyPart htmlBodyPart = new MimeBodyPart();
htmlBodyPart.setDataHandler(new DataHandler(new TextBinaryDataSource(
"<HTML><BODY>gmail経由でi.softbank.jp向けメール送信テスト[:1025:][:0105:]</BODY></HTML>".getBytes(),
"utf-8", "html", Emoji.Mode.SOFTBANK)));
htmlBodyPart.setHeader("Content-Transfer-Encoding", "base64");
alternativePart.addBodyPart(htmlBodyPart);

// inline image
MimeBodyPart imageBodyPart = new MimeBodyPart();

relatedPart.addBodyPart(imageBodyPart);

// set related
mimeMessage.setContent(relatedPart);


/* 送信日付を指定 */
mimeMessage.setSentDate(new Date());
/* 送信します */
Transport.send(mimeMessage);

} catch (Exception e) {
e.printStackTrace();
sendCheck = false;
}

return sendCheck;
}

public static void main(String[] args) {
SendMail send = new SendMail();
send.send("sgr.ukase@gmail.com","メールタイトル","メール本文");
}
}

web上の画像を連続して保存する

・SaveImage.txtに書かれているアドレスの画像を一行ずつgetする
・SaveImageフォルダに保存される


SaveImage.java

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.FileOutputStream;
import java.net.URL;
import java.net.HttpURLConnection;
import java.net.URLConnection;
import java.io.File;
import java.io.FileReader;

import java.nio.charset.StandardCharsets;

public class SaveImage {
    public static void main(String[] args) {
        executeGet();
        //executePost();
    }

    private static void executeGet() {
        System.out.println("===== HTTP GET Start =====");
        try {
        File file = new File("SaveImage.txt");
  BufferedReader br = new BufferedReader(new FileReader(file));
  String str = br.readLine();
  int count =0;
  while(str != null){
 
  System.out.println(str);
  URL url = new URL(str);
  URLConnection conn = url.openConnection();
  InputStream in = conn.getInputStream();
  File file2 = new File(String.format("SaveImage\\save%1$03d.jpg", count)); // 保存先
  FileOutputStream out = new FileOutputStream(file2, false);
  int b;
  while((b = in.read()) != -1){
  out.write(b);
  }
  out.close();
  in.close();
  count++;
  str = br.readLine();
  }
  br.close();
        //URL url = new URL("http://image3.photochoice.net/r/tn_248435_678_2906926_319902230_745de7ffca57cd3501eec381e27960be_1392302311/pc_watermark_6_h/0/1280x921/0x20_1280x921/logoh_00170684/"); // ダウンロードする URL

            /*URL url = new URL("http://yahoo.co.jp");

            HttpURLConnection connection = null;

            try {
                connection = (HttpURLConnection) url.openConnection();
                connection.setRequestMethod("GET");

                if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) {
                    try (InputStreamReader isr = new InputStreamReader(connection.getInputStream(),
                                                                       StandardCharsets.UTF_8);
                         BufferedReader reader = new BufferedReader(isr)) {
                        String line;
                        while ((line = reader.readLine()) != null) {
                            System.out.println(line);
                        }
                    }
                }
            } finally {
                if (connection != null) {
                    connection.disconnect();
                }
            }*/
        } catch (IOException e) {
            e.printStackTrace();
        }

        System.out.println("===== HTTP GET End =====");
    }

    private static void executePost() {
        System.out.println("===== HTTP POST Start =====");
        try {
            URL url = new URL("http://localhost:8080/post");

            HttpURLConnection connection = null;

            try {
                connection = (HttpURLConnection) url.openConnection();
                connection.setDoOutput(true);
                connection.setRequestMethod("POST");

                BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(connection.getOutputStream(),
                                                                                  StandardCharsets.UTF_8));
                writer.write("POST Body");
                writer.write("\r\n");
                writer.write("Hello Http Server!!");
                writer.write("\r\n");
                writer.flush();

                if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) {
                    try (InputStreamReader isr = new InputStreamReader(connection.getInputStream(),
                                                                       StandardCharsets.UTF_8);
                         BufferedReader reader = new BufferedReader(isr)) {
                        String line;
                        while ((line = reader.readLine()) != null) {
                            System.out.println(line);
                        }
                    }
                }
            } finally {
                if (connection != null) {
                    connection.disconnect();
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

        System.out.println("===== HTTP POST End =====");
    }
}