第2回 OpenCV教室

既存の画像処理関数による処理(エッジ検出)とその結果の表示・保存

以下のプログラムを実際に動かしてみよう。

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>

#ifdef _DEBUG
    //Debugモードの場合
    #pragma comment(lib,"opencv_core244d.lib")
    #pragma comment(lib,"opencv_imgproc244d.lib")
    #pragma comment(lib,"opencv_highgui244d.lib")
#else
    //Releaseモードの場合
    #pragma comment(lib,"opencv_core244.lib")
    #pragma comment(lib,"opencv_imgproc244.lib")
    #pragma comment(lib,"opencv_highgui244.lib")
#endif

using namespace std;

int main() {
	cv::Mat img_in = cv::imread("sample1.jpg");
	if (img_in.empty() == true) {
		cerr << "ファイルが読み込めません." << endl;
		cv::waitKey(0);
		return -1;
	}

	cv::Mat img_gray;
	cv::cvtColor(img_in, img_gray, CV_RGB2GRAY);

	cv::namedWindow("入力画像");
	cv::imshow("入力画像", img_in);

	cv::namedWindow("グレースケール化した入力画像");
	cv::imshow("グレースケール化した入力画像", img_gray);

	// Sobelオペレータによるエッジ検出
	cv::Mat sobelX, sobelY, norm, dir;
	cv::Sobel(img_gray, sobelX, CV_32F, 1, 0);
	cv::Sobel(img_gray, sobelY, CV_32F, 0, 1);
	cv::cartToPolar(sobelX, sobelY, norm, dir);
	
	double sob_min, sob_max;
	cv::minMaxLoc(norm, &sob_min, &sob_max);
	
	cv::Mat img_sobel;
	norm.convertTo(img_sobel, CV_8U, -255.0 / sob_max, 255);

	cv::Mat img_th;
	double threshold = 128.0;
	cv::threshold(img_sobel, img_th, threshold, 255, cv::THRESH_BINARY); 

	cv::namedWindow("Sobelオペレータによる処理画像");
	cv::imshow("Sobelオペレータによる処理画像", img_sobel);

	cv::namedWindow("閾値で二値化した処理画像");
	cv::imshow("閾値で二値化した処理画像", img_th);

	// 画像の保存
	cv::imwrite("gray1.png", img_gray);
	cv::imwrite("sobel1.png", img_sobel);
	cv::imwrite("th1.png", img_th);

	cv::waitKey(0);

	return 1;
}

処理対象ファイルは以下の「sample1.jpg」とする。

結果は以下のようになる。