前提・実現したいこと
OpenCVを用いて画像内のトマトの周りに長方形を表示したいです。
コードは、以下リンクのGitHubリポジトリにある「トマトの品質チェック」のものを使用しています。
https://github.com/shyampurk/TomatoQC
発生している問題・エラーメッセージ
Expected Ptr<cv::UMat> for argument 'img'
上記エラーが表示される箇所は、後述する「該当のソースコード」内にある以下の部分です。
cv2.rectangle(img,(xmin,ymin),(xmax,ymax),(255,0,0),5)
上記コードの第一引数であるimgには、以下のように画像を読み込んで入力されています。
img = io.imread(f)
該当のソースコード
import os import glob import cv2 import dlib from skimage import io import matplotlib.pyplot as plt (中略) print("Showing detections on the images in the object folder...") verify_files = glob.glob(os.path.join(random_check_folder, "*.JPG")) tot_verify_files = len(verify_files) positive_verify = 0 for f in verify_files: print("Processing file: {}".format(f)) img = io.imread(f) orig_img = img.copy() dets = detector(img) print("Number of object detected: {}".format(len(dets))) if len(dets)>0: positive_verify = positive_verify + 1 for k, d in enumerate(dets): print("Detection {}: Left: {} Top: {} Right: {} Bottom: {}".format( k, d.left(), d.top(), d.right(), d.bottom())) xmin = d.left() ymin = d.top() xmax = d.right() ymax = d.bottom() cv2.rectangle(img,(xmin,ymin),(xmax,ymax),(255,0,0),5) fig = plt.figure(figsize = (15,15)) ax1 = fig.add_subplot(211) ax1.set_xticks([]) ax1.set_yticks([]) ax1.set_title('Original Image') ax1.imshow(orig_img) ax2 = fig.add_subplot(212) ax2.set_xticks([]) ax2.set_yticks([]) ax2.set_title('Image with Detections') ax2.imshow(img) plt.show() print("% of Images Detected:",int(positive_verify*100/tot_verify_files))
考察・試したこと
原因として考えているのは
画像の読込みにはioを用いているのに対し
長方形の描画にはcv2を用いている
という点です。
おそらく、io.imreadで画像を読みこむ際のデータフォーマットが異なるのかと思いますが、具体的な解決方法が分かりません。
試したことは、
io.readで読み込んだ画像を以下のように、skimage.img_as_ubyte(img)を用いて変換してみました。
img = io.imread(f) cv2_img = skimage.img_as_ubyte(img) ... cv2.rectangle(cv2_img,(xmin,ymin),(xmax,ymax),(255,0,0),5)
しかし、同じエラーが出たままです。
解決方法のアドバイスをいただけたら幸いです。
何卒、よろしくお願いいたします。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。