• 締切済み

プログラミングできる方にお聞きします!!  二つのプログラムの結合を教えてください!!

今現在プログラム作成中ですが自分で作ったプログラムとOpenCVがどのように結合させたらいいか解りません!! 例えば #include "cv.h" #include "highgui.h" #ifdef _EiC #define WIN32 #endif static CvMemStorage* storage = 0; static CvHaarClassifierCascade* cascade = 0; void detect_and_draw( IplImage* image ); const char* cascade_name = "haarcascade_frontalface_default.xml"; /* "haarcascade_profileface.xml";*/ int main( int argc, char** argv ) { CvCapture* capture = 0; IplImage *frame, *frame_copy = 0; int optlen = strlen("--cascade="); const char* input_name; if( argc > 1 && strncmp( argv[1], "--cascade=", optlen ) == 0 ) { cascade_name = argv[1] + optlen; input_name = argc > 2 ? argv[2] : 0; } else { cascade_name = "../data/haarcascades/haarcascade_frontalface_alt2.xml"; input_name = argc > 1 ? argv[1] : 0; } cascade = (CvHaarClassifierCascade*)cvLoad( cascade_name, 0, 0, 0 ); ////////////省略///////////////////////////////////////////// ///////////////////////////////////////////////////////////// cvReleaseImage( &frame_copy ); cvReleaseCapture( &capture ); } else { const char* filename = input_name ? input_name : (char*)"lena.jpg"; IplImage* image = cvLoadImage( filename, 1 ); if( image ) { detect_and_draw( image ); cvWaitKey(0); cvReleaseImage( &image ); } else { /* assume it is a text file containing the list of the image filenames to be processed - one per line */ FILE* f = fopen( filename, "rt" ); if( f ) { char buf[1000+1]; while( fgets( buf, 1000, f ) ) { int len = (int)strlen(buf); while( len > 0 && isspace(buf[len-1]) ) len--; buf[len] = '\0'; image = cvLoadImage( buf, 1 ); if( image ) { detect_and_draw( image ); cvWaitKey(0); cvReleaseImage( &image ); } } fclose(f); } } } cvDestroyWindow("result"); return 0; } のようにOpenCVはコマンドライン引数からのプログラムで成り立っているのですが、これは別の関数に置き換えて自分のプログラムの中に挿入したいのですが・・・・どのような値をいれたら出力をするのかがわかりません。。。。 ようするにこのint main関数をかえてint sub_mainとおいて int main(void){ int....... sub_main(); ←別のmain内で呼ぶ } 説明の仕方が悪いと思いますが、申し訳ありませんがお教えして貰いたいです。。。

みんなの回答

回答No.2

> 試してみたところ、ビルドは成功して実行はできるのですが・・・ > ... "もともとのアプリケーション"は正しく実行されることは確認済ですよね? "もともとのアプリケーション"実行時のコマンドラインがたとえば motomoto --cascade=foo bar であったなら、 char* argv[] = { "motomoto", "--cascade=foo", "bar", 0 }; int argc = 3; sub_main(argc,argv); となります。

kobeya
質問者

お礼

御説明ありがとうございます。 プログラムのほうがようやく正常に起動いたしました。 これも丁寧なご説明のおかげで本当に感謝しています。

回答No.1

たとえば引数 "abc", "def", "ghi" を渡したいなら: char* argv[] = { "abc", "def", "ghi", 0 }; int argc = 3; sub_main(argc,argv);

kobeya
質問者

お礼

ありがとうございます!!!!! 早速試してみます!!

kobeya
質問者

補足

試してみたところ、ビルドは成功して実行はできるのですが・・・ OpenCVによるカメラのプログラムは終了できても永遠に カメラを使っているとみなされます。。。 なのでもう一度実行をしようにも、実行することができません 文が少しおかしい部分がありますがご了承ください。。。

関連するQ&A

  • C言語のシェルプログラミングの課題が分かりません。

    C言語のシェルプログラミングを作れという課題で、以下のように作ったんですが、実行して何度かコマンドを入力した後、exitによって一発で終わらせることができません。どのように書き換えればいいか教えて下さい。 また、他にも書き換えた方がよいと思えるところがあったら是非教えて下さいm(_ _)m #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <sys/wait.h> #include <sys/types.h> #include MAX_ARGS 10 #include MAX_LEN 100 extern char **environ; void child(int argc, char *argv[MAX_ARGS]); int main(void){ int argc, n = 0; int status; char input[MAX_LEN], *argv[MAX_ARGS], *cp; const char *delim = "\t\n"; while (1){ ++n; printf("$ "); fflush(stdout); if(fgets(input, sizeof(input), stdin) == NULL){ break; } cp = input; for(argc = 0; argc < MAX_ARGS; argc++){ if((argv[argc] = strtok(cp, delim)) == NULL) break; cp = NULL; } if(strcmp(argv[0], "exit") == 0){ exit(0); } pid_t pid = fork(); if(pid == -1){ perror("fork"); exit(1); }else if(pid == 0){ child(argc, argv); }else{ wait(&status); } } return 0; } void child(int argc, char *argv[MAX_ARGS]{ execvp(argv[0], argv); }

  • main の引数には const 付けた方が

    C言語での質問です。 引数を取るような main 関数は int main( int argc, char *argv[]){~} とされていますが、argvの指す文字列を変更する、というのはいくら何でもまずいので、 int main( int argc, const char *argv[]){~} あるいは int main( int argc, const char const * const * argv){~} の方がいいのではないでしょうか? 何故、constを付けない形が出回っているのでしょうか?

  • メイン関数

    メイン関数には int main(void) と int main(int argc, char** argv) がありますが、後者のint argc, char** argv はどういう意味なのでしょうか?

  • main(int argc,char **argv[])の意味を教えて下さい

     今晩は、Cの初心者です宜しくお願いします。  main関数の引数で、int main(int argc,char **argv[])とint main(int argc,char *argv[])と書かれている場合がありますが、 「**argv」と「*argv」の意味の違いはどのようなもので、どのように使い分けるのでしょうか。 また、必ずポインタ型でとるという決まりでしょうか。 宜しくお願いします。

  • c言語プログラミング実行時エラーについて質問です。

    c言語プログラミングを実行しようとすると、 エラーが出て次のようなメッセージが出てしまいました。 「「7行目」で記述エラーを発見しました。「constant expression」を付け忘れています。」 どなたか原因を教えてください。よろしくお願いいたします。 以下が失敗したプログラムです。 #include <stdio.h> int main(int argc, const char * argv[]) { const char FILENAME[] = "/Users/user/Desktop/date3.txt"; const int LEN = 100; char line [LEN]; char name [LEN]; char birth [LEN]; char address [LEN]; FILE *dat; dat = fopen(FILENAME, "r"); if ( dat == NULL ) { printf(" ファイル %s がオープンできません. ", FILENAME); return -1; } while( fgets( line, LEN, dat) != NULL ) { sscanf( line "%s, %s, %s", name ,birth, address ); printf("name = %s, address = %s\n", name, address ); } fclose(dat); return 0; }

  • strcpyのsegmentation fault

    118 char* argv[argc+1]; 120 121 for(i = 0; i < argc ; i++) 122 { 123 char tmp[BUF]; 124 while(buf[k]!=' ' & buf[k]!='\0') 125 { 126 tmp[j] = buf[k]; 127 j++; 128 k++; 129 } 130 tmp[j]='\0'; 131 j=0; 132 k++; 133 strcpy(argv[i],tmp); 134     //arg v[array]=tmp; 135 printf("temp = %s argv = %s\n",tmp,argv[array]); 136 } 137 argv[i+1]=tmp2; 133番の部分が問題です 最初に回る時にはprintfの結果が出ます temp = test argv = test でも2回目からはerrorになるます argv[1]は char*刑なのでstrcpyに何の問題もないと思いますが どんな問題でerrorがでるのでしょうか? これはlineを呼んで int main(int argc, char* argv[]) のargv部分をようにするためのcodeです errorの理由とか char* argv[]部分を簡単に作る方法を知りたいです お願いします

  • 次のようにセットされている文字列を出力するプログラムを作成したのですが

    次のようにセットされている文字列を出力するプログラムを作成したのですが、引数を渡すことができません。まだ、初心者でどこがいけないかが分かりません。ご教授をお願いいたします。 int _tmain(int argc, _TCHAR* argv[]) { int a=0; char name_main[50]; set_name(name_main); printf( "セットされている名前は%sです", name_main ); return 0; } void set_name(char *name) { int n=0; char *str=NULL; char str2[50] = "yamada taro"; str = (char*) malloc( sizeof(char) * 50); memcpy( str, str2, 50 );

  • このプログラムの動作について教えてください

    #include<stdio.h> #include<unistd.h> #define SIZE 10 int main(int argc,char *argv[]){ int fd; char buf[SIZE]; fd=open("data",0); read(fd,buf,10) write(1,buf,10); close(fd); rerutn 0; } というプログラムで dataの中身が以下のテキストファイルとなっているようなのんですが dataの内容:abcdefghijklmnopqrstuvwxyz このプログラムの出力結果がabcabcabce となるとの事なのですが何故でしょうか? 普通に先頭から10バイト分読み込んで出力するならabcdefghijとなるのではないのでしょうか? どうぞご教授お願いします

  • プログラムについて

    Opencvで作成したプログラムですが、コンパイルはできるのにエラーが出ます。助けてください。 #include <cv.h> #include <highgui.h> int main (int argc, char **argv) { int i; IplImage *src_img = 0, *src_gray = 0; const char *cascade_name = "haarcascade_frontalface_default.xml"; CvHaarClassifierCascade *cascade = 0; CvMemStorage *storage = 0; CvSeq *faces; static CvScalar colors[] = { {{0, 0, 255}}, {{0, 128, 255}}, {{0, 255, 255}}, {{0, 255, 0}}, {{255, 128, 0}}, {{255, 255, 0}}, {{255, 0, 0}}, {{255, 0, 255}} }; // (1)画像を読み込む if (argc < 2 || (src_img = cvLoadImage (argv[1], CV_LOAD_IMAGE_COLOR)) == 0) return -1; src_gray = cvCreateImage (cvGetSize (src_img), IPL_DEPTH_8U, 1); // (2)ブーストされた分類器のカスケードを読み込む cascade = (CvHaarClassifierCascade *) cvLoad (cascade_name, 0, 0, 0); // (3)メモリを確保し,読み込んだ画像のグレースケール化,ヒストグラムの均一化を行う storage = cvCreateMemStorage (0); cvClearMemStorage (storage); cvCvtColor (src_img, src_gray, CV_BGR2GRAY); cvEqualizeHist (src_gray, src_gray); // (4)物体(顔)検出 faces = cvHaarDetectObjects (src_gray, cascade, storage, 1.1, 3, 0, cvSize (20, 20)); // (5)検出された全ての顔位置に,円を描画する for (i = 0; i < (faces ? faces->total : 0); i++) { CvRect *r = (CvRect *) cvGetSeqElem (faces, i); CvPoint center; int radius; center.x = cvRound (r->x + r->width * 0.5); center.y = cvRound (r->y + r->height * 0.5); radius = cvRound ((r->width + r->height) * 0.25); cvCircle (src_img, center, radius, colors[i % 8], 3, 8, 0); } // (6)画像を表示,キーが押されたときに終了 cvNamedWindow ("Face Detection", CV_WINDOW_AUTOSIZE); cvShowImage ("Face Detection", src_img); cvWaitKey (0); return 0; }

  • 関数の引数の書き方。

    AとBのどちらの書き方でもよいのですか? 私が読んだ本(やさしいC)には、 Aパターンのみだったような? Aパターン ------------------ void main(int argc,char *argv[]) { int i; ・・・・ } Bパターン ------------------ void main(argc, argv) int argc; char *argv[]; { int i; ・・・・ } http://ash.jp/db/ora_c.htm

専門家に質問してみよう