初投稿!
プログラム初心者なので、間違えてたらごめんなさい。
タイトルのサンプルコードが動いたのでメモがわりに(^ω^)
Pythonの画像処理をやってみようと思い、検索したらこちらの記事が目に入りました。
画像解析初心者でしたのでサンプルコードをそのままコピーしたのですが・・・。そもそもコンパイルエラー(´;ω;`)
何が悪かったのか、他の記事も検索してみました。
すると、初心者の私でも分かりやすい記事が!
(てか、画像解析触れたかっただけだから、これで終わりにすれば良かったなw)
この記事のサンプルコードをとりあえずコピー・・・(笑)
import cv2
filename = "tapioca_drink.png"
#挿入
img = cv2.imread(filename)
'''
#表示
cv2.imshow('OpenCV', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
#保存
#cv2.imwrite('save.png', img)
'''
#色空間の変換
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) #BGR → グレースケール
'''
#表示
cv2.imshow('OpenCV', gray)
cv2.waitKey(0)
cv2.destroyAllWindows()
'''
#二値化処理
ret, thresh = cv2.threshold(gray, 127,255, cv2.THRESH_BINARY_INV)
'''
#表示
cv2.imshow('OpenCV', thresh)
cv2.waitKey(0)
cv2.destroyAllWindows()
'''
#輪郭検出
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
#print(contours)
#輪郭描画
cv2.drawContours(img, contours, -1, (255, 0, 255), 3)
#表示
cv2.imshow('OpenCV', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
画像をタピオカドリンクに変えて実行!
ストローまで数えてる(´・ω・`)
タピオカドリンクの記事にもありましたが、ストローの部分も濃い色であるため、単純な色の明るさだけだと検出できないらしいですね。
そしたら・・・。HSV使うかぁ(´;ω;`) (タピオカドリンクの記事を元にやっていきます。)
さてさて、とりあえず、いつも通り、サンプルコードをcontrol+c&control+v (コピー&ペースト) してと(笑)
from numpy import array, where, ones_like
from matplotlib import pyplot
## カラーで読み込んだ画像をcvtColorを用いてhsvに変更 ##
img_cl = imread('tapioca_drink.png', 6)
img_hsv = cvtColor(img_cl, COLOR_BGR2HSV)
## 赤色の範囲を定義 ##
hsv_min = array([150, 64, 0])
hsv_max = array([180, 255, 255])
## 赤色をマスクする ##
mask = inRange(img_hsv, hsv_min, hsv_max)
mask = bitwise_not(mask)
img_hsv = bitwise_and(img_hsv, img_hsv, mask = mask)
## 背景の黒い部分などを白くする ##
img_hsv[:, :, 2] = where(img_hsv[:, :, 2] < 10, 255 * ones_like(img_hsv[:, :, 2]), img_hsv[:, :, 2])
## HSVからBGRを経由して白黒に変更する ##
img_bgr = cvtColor(img_hsv, COLOR_HSV2BGR)
img_bw = cvtColor(img_bgr, COLOR_BGR2GRAY)
## ごみを取るためのブラシ処理 ##
img_bw_b = blur(img_bw, (3, 3))
## 暗い部分のみ残してみる ##
img_bw_b = where(img_bw_b < 90, 255, 0)
pyplot.imshow(img_bw_b)
・・・。まぁ、やっぱりできないか(´・ω・`)
【初心者向け】PythonとOpenCVで画像処理を体験してみよう の記事のおかげでちょっとは知識があったので、とりあえず、わかることは手直しっとw
#参照
#https://tech-blog.rakus.co.jp/entry/20201225/open-cv
#https://rightcode.co.jp/blog/information-technology/python-image-analysis-hsv-tapioca
#https://teratail.com/questions/307015
import cv2
import numpy
import matplotlib
import matplotlib.pyplot as plt
## カラーで読み込んだ画像をcvtColorを用いてhsvに変更 ##
img_cl = cv2.imread('tapioca_drink.png', 6)
img_hsv = cv2.cvtColor(img_cl, cv2.COLOR_BGR2HSV)
## 赤色の範囲を定義 ##
hsv_min = numpy.array([150, 64, 0])
hsv_max = numpy.array([180, 255, 255])
## 赤色をマスクする ##
mask = cv2.inRange(img_hsv, hsv_min, hsv_max)
mask = cv2.bitwise_not(mask)
img_hsv = cv2.bitwise_and(img_hsv, img_hsv, mask = mask)
## 背景の黒い部分などを白くする ##
img_hsv[:, :, 2] = numpy.where(img_hsv[:, :, 2] < 10, 255 * numpy.ones_like(img_hsv[:, :, 2]), img_hsv[:, :, 2])
## HSVからBGRを経由して白黒に変更する ##
img_bgr = cv2.cvtColor(img_hsv, cv2.COLOR_HSV2BGR)
img_bw = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2GRAY)
## ごみを取るためのブラシ処理 ##
img_bw_b = cv2.blur(img_bw, (3, 3))
## 暗い部分のみ残してみる ##
img_bw_b = numpy.where(img_bw_b < 90, 255, 0)
#cv2.imshow("test",img_bw_b)
cv2.imshow('marks',img_bw_b.astype(numpy.float32))
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.imwrite('save.png', img_bw_b)
インポートの部分を from から、 import に変えて、インポートしたものを使用するので、~.~ とやってみた。((cv2.imread)(numpy.ones)みたいに・・・。参照してるのかな・・・。)
すると・・・。
動いた!
☆.。.:*(嬉´Д`嬉).。.:*☆
そしたら、
上のソースコードの
import cv2
import numpy
import matplotlib
import matplotlib.pyplot as plt
## カラーで読み込んだ画像をcvtColorを用いてhsvに変更 ##
img_cl = cv2.imread('tapioca_drink.png', 6)
img_hsv = cv2.cvtColor(img_cl, cv2.COLOR_BGR2HSV)
## 赤色の範囲を定義 ##
hsv_min = numpy.array([150, 64, 0])
hsv_max = numpy.array([180, 255, 255])
## 赤色をマスクする ##
mask = cv2.inRange(img_hsv, hsv_min, hsv_max)
mask = cv2.bitwise_not(mask)
img_hsv = cv2.bitwise_and(img_hsv, img_hsv, mask = mask)
## 背景の黒い部分などを白くする ##
img_hsv[:, :, 2] = numpy.where(img_hsv[:, :, 2] < 10, 255 * numpy.ones_like(img_hsv[:, :, 2]), img_hsv[:, :, 2])
## HSVからBGRを経由して白黒に変更する ##
img_bgr = cv2.cvtColor(img_hsv, cv2.COLOR_HSV2BGR)
img_bw = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2GRAY)
## ごみを取るためのブラシ処理 ##
img_bw_b = cv2.blur(img_bw, (3, 3))
この部分と
【初心者向け】PythonとOpenCVで画像処理を体験してみよう
から
#二値化処理
ret, thresh = cv2.threshold(img_bw_b, 127,255, cv2.THRESH_BINARY_INV)
'''
#表示
cv2.imshow('OpenCV', thresh)
cv2.waitKey(0)
cv2.destroyAllWindows()
'''
#輪郭検出
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
#輪郭描画
cv2.drawContours(img_cl, contours, -1, (255, 0, 255), 3)
#輪郭検出した数をカウント
print(len(contours))
#表示
cv2.imshow('OpenCV', img_cl)
cv2.waitKey(0)
cv2.destroyAllWindows()
この部分丸々コピー&ペーストしてっとw
#参照
#https://rightcode.co.jp/blog/information-technology/python-image-analysis-hsv-tapioca
#参照をなおす
#https://tech-blog.rakus.co.jp/entry/20201225/open-cv
#https://code-graffiti.com/opencv-lucas-kanade-optical-flow-in-python/
#https://note.nkmk.me/python-opencv-bgr-rgb-cvtcolor/
#https://teratail.com/questions/307015
#cv2.imread(filename, 6)
#https://weblabo.oscasierra.net/python/opencv-image.html
#画像
import cv2
#輪郭検出用
import numpy
from numpy import dtype, uint8
import matplotlib
import matplotlib.pyplot as plt
filename = "tapioca_drink.png"
## カラーで読み込んだ画像をcvtColorを用いてhsvに変更 ##
img_cl = cv2.imread(filename, cv2.IMREAD_COLOR)
img_hsv = cv2.cvtColor(img_cl, cv2.COLOR_BGR2HSV)
## 赤色の範囲を定義 ##
hsv_min = numpy.array([150, 64, 0])
hsv_max = numpy.array([180, 255, 255])
## 赤色をマスクする ##
mask = cv2.inRange(img_hsv, hsv_min, hsv_max)
mask = cv2.bitwise_not(mask)
img_hsv = cv2.bitwise_and(img_hsv, img_hsv, mask = mask)
## 背景の黒い部分などを白くする ##
img_hsv[:, :, 2] = numpy.where(img_hsv[:, :, 2] < 10, 255 * numpy.ones_like(img_hsv[:, :, 2]), img_hsv[:, :, 2])
## HSVからBGRを経由して白黒に変更する ##
img_bgr = cv2.cvtColor(img_hsv, cv2.COLOR_HSV2BGR)
img_bw = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2GRAY)
## ごみを取るためのブラシ処理 ##
img_bw_b = cv2.blur(img_bw, (4, 4))
#二値化処理
ret, thresh = cv2.threshold(img_bw_b, 127,255, cv2.THRESH_BINARY_INV)
'''
#表示
cv2.imshow('OpenCV', thresh)
cv2.waitKey(0)
cv2.destroyAllWindows()
'''
#輪郭検出
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
#輪郭描画
cv2.drawContours(img_cl, contours, -1, (255, 0, 255), 3)
#輪郭検出した数をカウント
print(len(contours))
#表示
cv2.imshow('OpenCV', img_cl)
cv2.waitKey(0)
cv2.destroyAllWindows()
そして実行!
動いた ヤッター! (≧▽≦)
めっちゃ時間かかったw
ちょっと、やり方違うかもですが、とりあえず動いてよかった(⌒∇⌒)
わかりにくくってごめんなさい(´;ω;`)
参照元
参照をなおすために見た参照元