質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

1906閲覧

OpenCV 矩形検出から射影変換 座標設定方法

mmmw

総合スコア23

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2020/06/15 12:07

編集2020/06/15 13:49

前提・実現したいこと

現在、下のサンプル画像を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/ツールのバージョンなど)

visual studio 2019
opencv3.4イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

何を問題点としている話なのかが全くわかりません.
なぜならば,そのコードをそこまでご自身で書かれたのならば,話は全て自明であろうと思えるからです.

  • 変換元

コレ:
approxPolyDP(Mat(contours[i]), approx, 0.01 * arcLength(contours[i], true), true);
の結果,approxとはどんなデータになるのか? というのを{思い出す,調べる,etc}すれば一発でしょう.
(そもそもif (approx.size() == 4){...}とか判定している以上,把握できているハズだが……?)

  • 変換先

「知らんがな」としか.
だって,「どこにどんな形でwarpさせたいのか」は,あなたしか知らないので.

#「そんな単純な話をしているのではない and/or そんな単純な処理だとうまくいかないから訊いている」等といった話であるならば,その旨を明記してください.

投稿2020/06/16 01:11

fana

総合スコア11658

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問