前提・実現したいこと
現在、下のサンプル画像を2値化から矩形検出をし射影変換をするプログラムを作成しています。
実現したい事
・矩形検出後の頂点座標を取得し射影変換する
・射影変換前後の座標の設定
発生している問題・エラーメッセージ
輪郭の頂点座標取得方法が分かりません。
矩形検出は実行出来ていますが、射影変換前後の座標設定の方法が分からず、射影変換をうまく実装できていません。
Point2f src[4]; //変換元
Point2f dst[4]; //変換先
該当のソースコード
#define _CRT_SECURE_NO_WARNING
#define _USE_MATH_DEFINES
#include<iostream>
#include<cmath>
#include<opencv2/opencv.hpp>
using namespace std;
using namespace cv;
string win_src = "src";
string win_src1 = "src1";
string win_dst = "dst";
int main()
{
string file_src = "sample.jpg"; //入力画像のファイル
string file_dst = "dst.jpg"; //出力画像のファイル
Mat img_src = imread(file_src, 1); //入力画像(カラー)の読み込み
//Mat img_src = imread(file_src, 0); //入力画像(グレースケール)の読み込み
Mat img_dst1,gray_img,img_src1; int thresh=130; if (!img_src.data) { cout << "error" << endl; return -1; } //ウインドウ作成 namedWindow(win_src, WINDOW_AUTOSIZE); namedWindow(win_dst, WINDOW_AUTOSIZE); //ここに核となる処理を記述する //グレースケール→二値化 cvtColor(img_src, gray_img, CV_RGB2GRAY); threshold(gray_img, img_dst1, thresh, 255, THRESH_BINARY); vector<vector<Point>> contours; vector<Vec4i> hierarchy; findContours(img_dst1, contours, hierarchy, RETR_EXTERNAL, CHAIN_APPROX_TC89_L1); int max_level = 0; for (int i = 0; i < contours.size(); i++) { //ある程度面積のあるものだけに絞る double a = contourArea(contours[i], false); if (a > 15000) { //輪郭を直線近似する vector<Point> approx; approxPolyDP(Mat(contours[i]), approx, 0.01 * arcLength(contours[i], true), true); //矩形のみ取得 if (approx.size() == 4) { drawContours(img_src, contours, i, Scalar(255, 0, 0, 255), 3, CV_AA, hierarchy, max_level); } } } Point2f src[4]; //変換元 Point2f dst[4]; //変換先 Mat perspective_matrix = getPerspectiveTransform(src, dst); warpPerspective(img_src, img_src1, perspective_matrix, img_src.size(), INTER_LINEAR); imshow(win_src, img_dst1); //二値化画像 imshow(win_src1, img_src1); //射影変換前 imshow(win_dst, img_src); //射影変換後 //imwrite(file_dst, img_dst); //処理結果の保存 waitKey(0); //キー入力待ち return 0;
}
試したこと
補足情報(FW/ツールのバージョンなど)
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。