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

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

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

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

OpenCV

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1429閲覧

findcontoursの結果をcsvに出力

mukai1174

総合スコア5

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

OpenCV

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/09/09 09:03

編集2019/09/09 09:11

画像から抽出した複数の輪郭の各面積を1つのcsvファイルに出力したいです。csvの書き込みイメージは、
A B
1 輪郭番号 面積
2 輪郭番号 面積

のような感じです。
printでは上手く輪郭番号と面積は出力されましたが、それをcsvに出力する方法が分かりません。
コードは以下になります。まだ初心者の為、不要なコードも含まれているかもしれませんがご了承下さい。是非ともお力添えををお願い致します。
for分の下が投稿するとタブ空白が消えて左つめになってしまっていますが、areaとprintはタブ空白あります。

import cv2
import numpy as np
from matplotlib import pyplot as plt
import sys
import csv

img = cv2.imread('dot.jpg')
b = cv2.bitwise_not(img)

c=cv2.cvtColor(b,cv2.COLOR_BGR2GRAY)
d=cv2.threshold(c,50,255,cv2.THRESH_BINARY_INV)[1]

e = cv2.bitwise_not(d)

image, contours, hierarchy = cv2.findContours(e,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)

for i, cnt in enumerate(contours):
area = cv2.contourArea(cnt)
print('contour: {}, area: {}'.format(i, area))

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

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

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

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

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

guest

回答1

0

ベストアンサー

回答

csv モジュールをお使いください。
使い方については下記リンクを参照ください。

Python - CSV の読み込み/書き込み まとめ - Pynote

コード

イメージ説明

入力画像

python

1import cv2 2import csv 3 4# 画像を読み込む。 5img = cv2.imread("test.png") 6 7# グレースケールに変換する。 8gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 9 10# 輪郭を抽出する。 11image, contours, hierarchy = cv2.findContours(gray, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) 12 13data = [] 14for i, cnt in enumerate(contours): 15 area = cv2.contourArea(cnt) 16 data.append({"No": i, "Area": area}) 17 18with open("output.csv", "w", newline="") as f: 19 writer = csv.DictWriter(f, fieldnames=["No", "Area"]) 20 writer.writerows(data)
0,4900.0 1,3362.0 2,10743.0 3,3784.0 4,1923.0

追記

csv モジュールを使わない方法

python

1import cv2 2 3# 画像を読み込む。 4img = cv2.imread("test.png") 5 6# グレースケールに変換する。 7gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 8 9# 輪郭を抽出する。 10image, contours, hierarchy = cv2.findContours( 11 gray, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE 12) 13 14data = [] 15for cnt in contours: 16 area = cv2.contourArea(cnt) 17 data.append(area) 18 19with open("output.csv", "w", newline="") as f: 20 f.write("No,Area\n".format(i, area)) 21 for i, area in enumerate(data): 22 f.write("{},{}\n".format(i, area))

参考文献

投稿2019/09/09 09:13

編集2019/09/09 15:12
tiitoi

総合スコア21956

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

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

mukai1174

2019/09/09 11:13

ご回答ありがとうございます。回答者様のサンプル画像とコードで試したみましたら以下のようなエラーがかえってきてしまいました。何が問題だと思われるでしょうか? runfile('C:/Users/xxx/abc.py', wdir='C:/Users/xxx') Reloaded modules: csv Traceback (most recent call last): File "<ipython-input-16-e2ca45ba9c88>", line 1, in <module> runfile('C:/Users/xxx/abc.py', wdir='C:/Users/xxx') File "C:\Users\xxx\Anaconda3\envs\openCV\lib\site-packages\spyder_kernels\customize\spydercustomize.py", line 827, in runfile execfile(filename, namespace) File "C:\Users\xxx\Anaconda3\envs\openCV\lib\site-packages\spyder_kernels\customize\spydercustomize.py", line 110, in execfile exec(compile(f.read(), filename, 'exec'), namespace) File "C:/Users/xxx/abc.py", line 18, in <module> contours, hierarchy = cv2.findContours(gray, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) ValueError: too many values to unpack (expected 2)
tiitoi

2019/09/09 12:13

OpenCV3 をお使いの場合、findContours() の返り値は image, contours, hierarchy の3つになります。 質問のコードを修正したので、これでどうでしょうか?
mukai1174

2019/09/09 12:54

ご対応ありがとうございます。再度実行してみましたが下記エラーが出てしまいました。自分でもエラー修正を試みましたが分からずご協力して頂けると大変ありがたいです。 runfile('C:/Users/xxx/abc.py', wdir='C:/Users/xxx') Reloaded modules: csv Traceback (most recent call last): File "<ipython-input-2-e2ca45ba9c88>", line 1, in <module> runfile('C:/Users/xxx/abc.py', wdir='C:/Users/xxx') File "C:\Users\xxx\Anaconda3\envs\openCV\lib\site-packages\spyder_kernels\customize\spydercustomize.py", line 827, in runfile execfile(filename, namespace) File "C:\Users\xxx\Anaconda3\envs\openCV\lib\site-packages\spyder_kernels\customize\spydercustomize.py", line 110, in execfile exec(compile(f.read(), filename, 'exec'), namespace) File "C:/Users/xxx/abc.py", line 26, in <module> writer = csv.DictWriter(f, fieldnames=["No", "Area"]) AttributeError: module 'csv' has no attribute 'DictWriter'
tiitoi

2019/09/09 15:13

'csv' has no attribute 'DictWriter' となる理由はわかりませんが、csv モジュールを使わない方法を追記しました。
mukai1174

2019/09/09 23:26

上手く出力されました。ご協力して頂きまして大変助かりました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問