flying penguin

Ubuntuが好きな管理人二人がお送りする技術ブログ。

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 - 画像を表示する関数ですね。名前的に分かりやすくて好きです。。

以上ですがわかりますかね…?どんな質問でも受け付けますので質問、ご指摘お待ちしております。
ぼくもチンパンなので間違いは多いかもしれません。先人方、教えてください。