URGの自作プログラム

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
penta

URGの自作プログラム

#1

投稿記事 by penta » 5年前

URGのプログラムをネットのソースプログラムを参考に作ってみたのですが、コンパイルは通るのですが、実行ファイルを実行しても
コマンドプロンプトに打ち込むところまではうまくいくのですが一瞬実行されたあと瞬時に消えてしまいます。
その理由がわからず困っています。
どなたかお分かりでしたら教えていただきたいです。よろしくお願いします。
// シリアル接続でのセンサとの接続と距離データの取得・表示

#include "urg_sensor.h"
#include "urg_utils.h"
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv/cvaux.h>
#include <opencv/highgui.h>


#include "opencv2/opencv.hpp"

using namespace cv;

#define WIDTH 1200 //ウィンドウの横幅
#define HEIGTH 750 //ウィンドウの縦幅


int main(int argc, char *argv[])
{

FILE *fp;

urg_t urg;
int scan_times=0; //スキャン時間[0.01s刻み]
int ret;
int n = 0,count = 0; //原点からの線分 Yes/No
int t = 0; //テキストデータ取得の有無
int i, j=0,k=0,l=0;
int m = 0; //倍率
long *length_data; //距離データ
int length_data_size; //1スキャン時のスキャン数
int a=0,b=0;
vector<int> ptr;

int xa[1000] = {0}; //ウィンドウ表示時のx座標
int ya[1000] = {0}; //ウィンドウ表示時のy座標
int x1[1000] = {0}; //jスキャン時のx座標の合計
int y1[1000] = {0}; //jスキャン時のx座標の合計
int xb[100][100] = {0.0};
int yb[100][100] = {0.0};
char saveImage[30];
char saveImage2[30];
char gazou[30];

int dx = 0;
int dy = 0;
int sx[1000] = {0}; //jスキャン時のx軸方向の速度
int sy[1000] = {0}; //jスキャン時のy軸方向の速度
double radian; //角度[rad]
long length; //長さ[mm]



//設定画面
printf("倍率 :"); scanf("%d",&m);
printf("特徴点の数 :"); scanf("%d",&n);
printf("ファイル名 :"); scanf("%s",&gazou);
printf("scan_times="); scanf("%d",&scan_times);



VideoCapture cap("video.avi");

VideoWriter writer("test1.avi", CV_FOURCC_DEFAULT, 10, Size(640, 480), true);

//ウィンドウ生成
cv::namedWindow("drawing", CV_WINDOW_AUTOSIZE|CV_WINDOW_FREERATIO);
cv::Mat scan_img = cv::Mat::zeros( HEIGTH, WIDTH, CV_8UC3);
cv::Mat track_img = cv::Mat::zeros( HEIGTH, WIDTH, CV_8UC3);
cvMoveWindow("drawing",0,0);

// "COM1" は、センサが認識されているデバイス名にする必要がある
const char connect_device[] = "COM10";
const long connect_baudrate = 115200;

// センサに対して接続を行う。
ret = urg_open(&urg, URG_SERIAL, connect_device, connect_baudrate);

for (j = 0; j < scan_times; ++j) {

// データ受信のための領域を確保する
length_data = (long *)malloc(sizeof(long) * urg_max_data_size(&urg));

// センサから距離データを取得する。
ret = urg_start_measurement(&urg, URG_DISTANCE, 1, 0);
length_data_size = urg_get_distance(&urg, length_data, NULL);

for (i = 0; i < length_data_size; ++i) {

// その距離データのラジアン角度を求め、X, Y の座標値を計算する
radian = urg_index2rad(&urg, i);
length = length_data;

//xy座標に変換
x1 = (long)(length * cos(radian));
y1 = (long)(length * sin(radian));

}
for (i = 0; i < length_data_size; ++i) {
//ウィンドウ画面用に座標変換
xa = -1* x1 / m + HEIGTH / 2 ;
ya = -1* y1 / m + WIDTH / 2 ;

//ウィンドウにx,y座標系でプロット
if(length_data-length_data[i-1] < -50 || 50 < length_data-length_data[i-1] ){
cv::line(scan_img, cv::Point(ya, xa[i]), cv::Point(ya[i], xa[i]), cv::Scalar(0,0,200), 1, CV_AA);
}
else{
cv::line(scan_img, cv::Point(ya[i], xa[i]), cv::Point(ya[i-1], xa[i-1]), cv::Scalar(0,0,200), 1, CV_AA);
}

}

//ウィンドウ画面に表示
cv::imshow("drawing", scan_img);

//10msec待機
cv::waitKey(10);
sprintf(saveImage, "one_scan_data.png");
cv::imwrite(saveImage, scan_img);

// (1)load a specified file as a 3-channel color image
const char *imagename = argc > 1 ? argv[1] : "C:/Users/10t435/Desktop/研究室1/one_scan_data.png";
Mat harris_img = imread(imagename);
if(!harris_img.data)
return -1;

// (2)convert to a grayscale image and normalize it
Mat gray_img;
cvtColor(harris_img, gray_img, CV_BGR2GRAY);
normalize(gray_img, gray_img, 0, 255, NORM_MINMAX);

// (4)detect and draw strong corners on the image using Harris detector
vector<Point2f> corners;
goodFeaturesToTrack(gray_img, corners, n, 0.0001, 50, Mat(), 3, true);
vector<Point2f>::iterator it_corner = corners.begin();
for(; it_corner!=corners.end(); ++it_corner) {

circle(track_img, Point(it_corner->x, it_corner->y), 1, Scalar(0,255,0), -1);
circle(track_img, Point(it_corner->x, it_corner->y), 8, Scalar(0,255,0 ));

}

if (harris_img.empty()) // 再生終了時にはemptyが設定される
break;

// (6)show destination images, and quit when any key pressed
namedWindow("Harris",CV_WINDOW_AUTOSIZE);
cvMoveWindow("Harris",0,0);
imshow("Harris", harris_img);

//フレームの保存
writer << harris_img;

sprintf(saveImage, "%s%d_harris.png",gazou,k);
cv::imwrite(saveImage, harris_img);

k++;
scan_img = cv::Mat::zeros( HEIGTH, WIDTH, CV_8UC3);
harris_img = cv::Mat::zeros( HEIGTH, WIDTH, CV_8UC3);


namedWindow("Track",CV_WINDOW_AUTOSIZE);
cvMoveWindow("Track",0,0);
imshow("Track", track_img);
track_img = cv::Mat::zeros( HEIGTH, WIDTH, CV_8UC3);
}
// センサとの接続を閉じる。
urg_close(&urg);


system("PAUSE");
cvDestroyWindow("drawing");
return 0;
}

“C言語何でも質問掲示板” へ戻る