OpenCV学びながらC++も学ぼう
こんにちは。いやこんばんは。pizzaxです。
C言語分かるけどC++は分からないよ!って人向けに昨日のコードを解説します。もうひとりの管理人紳士なチキン向け記事でもあります。
車輪の再発明。
それではOpenCVの基礎の基礎!画像表示するだけのプログラムを見てみましょう。
imshow.cpp
#include <iostream> #include <opencv2/highgui/highgui.h> int main (int argc, int *argv[]){ if (argc < 2){ std::cout << "入力画像がありません。" <<std::endl; std::cout << "usage :" << argv[0] <<" <imagefile> " << std:endl; return 1; } cv::Mat image; //画像を入れるクラスです。実態は一次元配列です。 image = cv::imread(argv[1]); //先述の画像用クラスに、第一引数の画像を入力します。 cv::imshow("image",image); // "image"というウィンドウに 先述の画像用クラスを表示します。 return 0; }
まずはここから。
int main(int argc, char* argv[]){ ...
argc - プログラムの引数の数
argv - プログラムの引数
例えば、
./imshow image.jpg
として実行した場合、
argc = 2;
argv[0] = imshow
argv[1] = image.jpg
となります。 argv[0]には常にその実行バイナリ名が入ります。
※当然 Cの最小構成のように void main() ~ でも書けます。
if (argc < 2){ std::cout << "入力画像がありません。" <<std::endl; std::cout << "usage :" << argv[0] <<" <imagefile> " << std:endl; return 1; }
引数が足りない場合にエラーを返し終了、かつ使い方を表示する 箇所です。
これをしないと画像を参照する箇所で怒られます。なるべく書くようにしましょう。
std::cout -これはC++におけるprintfのようなものです。
C++標準ライブラリをインクルードする時は ".h"を書きません。あっても動きます。たぶん。
std::ってなんだよ!ってのはもうちょっと先で書きますね。
cv::Mat image; //画像を入れるクラスです。実態は一次元配列です。 image = cv::imread(argv[1]); //先述の画像用クラスに、第一引数の画像を入力します。 cv::imshow("image",image); // "image"というウィンドウに 先述の画像用クラスを表示します。 return 0;
cv::Mat というのが出てきました。
"std"とか"cv"ってなんだよ!って思いますよね。これは名前空間と呼ばれるものです。
namespace cv { Mat(... } namespace std { cout ( ... }
こんな感じでヘッダに宣言されているはずです。たぶん。
cv::Matってのは、名前空間"cv"内のMatクラスを使いますよ!って宣言です。
image = cv::imread(argv[1]); //先述の画像用クラスに、第一引数の画像を入力します。 cv::imshow("image",image); // "image"というウィンドウに 先述の画像用クラスを表示します。 return 0;
cv::imread - 画像を読み込む関数ですね。名前的に分かりやすくて好きです。
cv::imshow - 画像を表示する関数ですね。名前的に分かりやすくて好きです。。
以上ですがわかりますかね…?どんな質問でも受け付けますので質問、ご指摘お待ちしております。
ぼくもチンパンなので間違いは多いかもしれません。先人方、教えてください。