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

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

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

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

Q&A

2回答

3314閲覧

C++のCAD上で作成した図形の輪郭切り取り

DOLL1515

総合スコア8

C++

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

0グッド

0クリップ

投稿2016/10/13 06:07

編集2016/10/26 03:48
C++
CADで図のような立体画像を作成し、この画像の赤い部分のような、輪郭画像を抽出するプログラムを作成しました。このプログラムを使用し現在カメラのレンズ部分とフラッシュ部分の二つの穴の輪郭を抽出するプログラムを作っているところですが、難しいです。誰かわかる方いませんか?プログラムは長いので改造する部分のみここに記述します。 ###該当のソースコード }![イメージ説明](9b3bc1d93208e455183939cf7f97ab56.jpeg)

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

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

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

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

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

coco_bauer

2016/10/13 08:16

どのようなアルゴリズムを使って実現しようとしているのでしょうか? そして、何が「難しい」のでしょうか? 解決したい事を具体的に書いてください。
guest

回答2

0

簡単な考え方について回答します。

#手順

####1.二分探査でカメラが写る領域を探索
処理範囲を減らすためにカメラが存在する領域を探す。
図では途中で終了しているが最後まで行ってカメラがぎりぎり写る範囲を調べる。
二分探査イメージ
探査後のイメージ。
探査後のイメージ

####2.左上から走査し、カメラの内側に存在する空洞を探索
空洞は、X軸について
1:カメラ領域を検知
2:背景を検知
3:カメラ領域を検知
の順で検知した場合に空洞であると判定できる。

1,2を満たして3を満たさなかった為に空洞でない。
囲まれていないパターン

走査していき、空洞を初めて検知した。
空洞検知

####3.空洞の外形を探索
空洞の外形は、空洞を検知した位置を中心とした正方形について
カメラ領域と背景の境界となる位置を再帰的になぞると描くことができる。

右、下、左、上 の順で優先度を高く探査した場合のイメージ。
空洞の外形探索

再帰が開始場所まで戻ると外形が完成する。
空洞の外形探索終了

####4.画像の終端まで走査する
一度見つけた空洞はスキップしながら右下まで2.と3.を繰り返す。

#注意
上記の方法はノイズの除去について触れられていません。
探査するときはノイズとする長さを決めて判定してください。

投稿2017/01/26 13:39

Rag

総合スコア19

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

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

0

OpenCVとPythonをつかってプロトタイピングをしてみました。与えられた画像に対してはそれっぽく検知できます。C++への移植はがんばってください。

Python

1#!/usr/bin/env python3 2# -*- coding: utf-8 -*- 3import cv2 4import numpy as np 5 6img = cv2.imread('input.jpg') 7 8# 2値化 9tmp = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 10_, tmp = cv2.threshold(tmp, 16, 255, cv2.THRESH_BINARY) 11 12# 8近傍カーネルによるノイズ除去 13neibor8 = np.ones((3,3), np.uint8) 14tmp = cv2.morphologyEx(tmp, cv2.MORPH_OPEN, neibor8, iterations=3) 15tmp = cv2.morphologyEx(tmp, cv2.MORPH_CLOSE, neibor8, iterations=3) 16 17# 輪郭抽出 18_, contours, _ = cv2.findContours(tmp, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE) 19contours.sort(key=cv2.contourArea, reverse=True) 20 21# 外枠描画 22# cv2.drawContours(img, contours, 0, (255, 255, 255), 3) 23 24# "カメラ"を楕円近似 25obj_camera = cv2.fitEllipse(contours[1]) 26cv2.ellipse(img, obj_camera, (255, 0, 0), 3) 27 28# "フラッシュ"を矩形近似 29obj_flash = cv2.minAreaRect(contours[2]) 30obj_flash = np.int0(cv2.boxPoints(obj_flash)) 31cv2.drawContours(img, [obj_flash], 0, (0,0,255), 3)

結果画像(青枠="カメラ"、赤枠="フラッシュ"):
結果画像

投稿2016/10/26 05:58

編集2016/10/26 06:02
yohhoy

総合スコア6191

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問