tomo0415
@tomo0415

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

class内での計算結果をprintで出力したいです。

class内での計算結果をprintで出力したいです。

ヒートマップのような図を作っているのですが、その図の指定した座標での値をprintで出力したいのですが、うまく出来ません。
図は出力できました。
print(self._depth_map[222,202])で、座標が[222,202]のときself._depth_map[y,x] = distance *math.cos(phi) * math.cos(lamb)を
出力したいのですが、方法が分かりません。

発生している問題・エラー

 print(self._depth_map[222,202])
NameError:name'self' is not defined

該当するソースコード

def depth_estimation(self, axis="vertical",threshold=(0.0,2.0), save=None, show=True):
        assert self._disparity_map is not None, "Plz run stereo matching first."
        height = self._left_image.shape[0]
        width = self._left_image.shape[1]
        self._depth_map = np.zeros(self._disparity_map.shape , np.float32)
        if axis == "vertical":
            for y in range(height):
                for x in range(width):
                    lamb = (1.0 - y/(height/2.0)) * (math.pi/2.0)
                    phi = (x/(width/2.0) - 1.0) * (math.pi/2.0)
                    delta_phi = self._disparity_map[y,x] / (width/2.0) * (math.pi/2.0)
                    distance = self._baseline * math.sin(math.pi/2.0 - phi) / (1e-7+math.sin(delta_phi) * math.cos(lamb))
                    self._depth_map[y,x] = distance *math.cos(phi) * math.cos(lamb)
        elif axis == "horizontal":
            for y in range(height):
                for x in range(width):
                    lamb = (1.0 + y/(height/2.0)) * (math.pi/2.0)
                    phi = (1.0 - x/(width/2.0)) * (math.pi/2.0)
                    delta_lamb = -(self._disparity_map[y,x] / (width/2.0)) * (math.pi/2.0)
                    distance = self._baseline * math.sin(math.pi/2.0 - lamb) / (1e-7+math.sin(delta_lamb) * math.cos(phi))
                    self._depth_map[y,x] = distance * math.cos(phi)
        self._depth_map = np.where((self._depth_map < threshold[0]) | (self._depth_map > threshold[1]), 0.0, self._depth_map)
        if save:
            fig = plt.figure(figsize=(15,15))
            plt.imshow(self._depth_map)
            plt.axis("off")
            fig.savefig(save)
        if show:
            self._show_images(images=[cv2.cvtColor(self._image, cv2.COLOR_BGR2RGB), self._depth_map], titles=["Original", "Depth"], figsize=(30,20), subplot=(1,2),color_bar=True)
        return self._depth_map
    print(self._depth_map[222,202])

    def _show_images(self, images, titles, figsize, subplot, color_bar=False):
        # images -> show images
        plt.figure(figsize=figsize)
        for i, (image, title) in enumerate(zip(images, titles)):
            plt.subplot(subplot[0], subplot[1], i+1)
            plt.imshow(image)
            plt.title(title)
            plt.axis("off")
            if i==1 and color_bar:
                plt.colorbar()
        plt.show()

print(self._depth_map[222,202])がエラーの原因です。

0

2Answer

恐らくコピーの際にインデントがおかしくなったと思われますが、
元のコードは以下のようなインデントですかね?

class Something:
    def __init__(self):
        # something
        pass
    
    def depth_estimation(self, axis="vertical",threshold=(0.0,2.0), save=None, show=True):
        assert self._disparity_map is not None, "Plz run stereo matching first."
        height = self._left_image.shape[0]
        width = self._left_image.shape[1]
        self._depth_map = np.zeros(self._disparity_map.shape , np.float32)
        if axis == "vertical":
            for y in range(height):
                for x in range(width):
                    lamb = (1.0 - y/(height/2.0)) * (math.pi/2.0)
                    phi = (x/(width/2.0) - 1.0) * (math.pi/2.0)
                    delta_phi = self._disparity_map[y,x] / (width/2.0) * (math.pi/2.0)
                    distance = self._baseline * math.sin(math.pi/2.0 - phi) / (1e-7+math.sin(delta_phi) * math.cos(lamb))
                    self._depth_map[y,x] = distance *math.cos(phi) * math.cos(lamb)
        elif axis == "horizontal":
            for y in range(height):
                for x in range(width):
                    lamb = (1.0 + y/(height/2.0)) * (math.pi/2.0)
                    phi = (1.0 - x/(width/2.0)) * (math.pi/2.0)
                    delta_lamb = -(self._disparity_map[y,x] / (width/2.0)) * (math.pi/2.0)
                    distance = self._baseline * math.sin(math.pi/2.0 - lamb) / (1e-7+math.sin(delta_lamb) * math.cos(phi))
                    self._depth_map[y,x] = distance * math.cos(phi)
        self._depth_map = np.where((self._depth_map < threshold[0]) | (self._depth_map > threshold[1]), 0.0, self._depth_map)
        if save:
            fig = plt.figure(figsize=(15,15))
            plt.imshow(self._depth_map)
            plt.axis("off")
            fig.savefig(save)
        if show:
            self._show_images(images=[cv2.cvtColor(self._image, cv2.COLOR_BGR2RGB), self._depth_map], titles=["Original", "Depth"], figsize=(30,20), subplot=(1,2),color_bar=True)
        return self._depth_map
    print(self._depth_map[222,202])

    def _show_images(self, images, titles, figsize, subplot, color_bar=False):
        # images -> show images
        plt.figure(figsize=figsize)
        for i, (image, title) in enumerate(zip(images, titles)):
            plt.subplot(subplot[0], subplot[1], i+1)
            plt.imshow(image)
            plt.title(title)
            plt.axis("off")
            if i==1 and color_bar:
                plt.colorbar()
        plt.show()

質問の回答ですが、depth_estimationを呼び出したときにそのまま出力するなら以下のようにします。

def depth_estimation(self, axis="vertical",threshold=(0.0,2.0), save=None, show=True):
    assert self._disparity_map is not None, "Plz run stereo matching first."
    height = self._left_image.shape[0]
    width = self._left_image.shape[1]
    self._depth_map = np.zeros(self._disparity_map.shape , np.float32)
    if axis == "vertical":
        for y in range(height):
            for x in range(width):
                lamb = (1.0 - y/(height/2.0)) * (math.pi/2.0)
                phi = (x/(width/2.0) - 1.0) * (math.pi/2.0)
                delta_phi = self._disparity_map[y,x] / (width/2.0) * (math.pi/2.0)
                distance = self._baseline * math.sin(math.pi/2.0 - phi) / (1e-7+math.sin(delta_phi) * math.cos(lamb))
                self._depth_map[y,x] = distance *math.cos(phi) * math.cos(lamb)
    elif axis == "horizontal":
        for y in range(height):
            for x in range(width):
                lamb = (1.0 + y/(height/2.0)) * (math.pi/2.0)
                phi = (1.0 - x/(width/2.0)) * (math.pi/2.0)
                delta_lamb = -(self._disparity_map[y,x] / (width/2.0)) * (math.pi/2.0)
                distance = self._baseline * math.sin(math.pi/2.0 - lamb) / (1e-7+math.sin(delta_lamb) * math.cos(phi))
                self._depth_map[y,x] = distance * math.cos(phi)
    self._depth_map = np.where((self._depth_map < threshold[0]) | (self._depth_map > threshold[1]), 0.0, self._depth_map)
    if save:
        fig = plt.figure(figsize=(15,15))
        plt.imshow(self._depth_map)
        plt.axis("off")
        fig.savefig(save)
    if show:
        self._show_images(images=[cv2.cvtColor(self._image, cv2.COLOR_BGR2RGB), self._depth_map], titles=["Original", "Depth"], figsize=(30,20), subplot=(1,2),color_bar=True)
    # 変更箇所
    print(self._depth_map[222,202])
    return self._depth_map

インスタンス化したクラスからdepth_estimationを呼び出し、その戻り値を利用するなら以下のようにします。

something = Something()
depth_map = something.depth_estimation()
print(depth_map[222,202])
2Like

Comments

  1. @tomo0415

    Questioner

    ご回答ありがとうございます。
    やってみます。
  2. @tomo0415

    Questioner

    def depth_estimationのclassが以下のようにしていたため、

    class DepthEstimator():
    def __init__(self, num_disparities, window_size, baseline):
    self._num_disparities = num_disparities # disparity detection pixel range
    self._window_size = window_size # matching window size
    self._baseline = baseline # baseline length in meter
    self._image = None # image
    self._left_image = None # image left half
    self._right_image = None # image right half
    self._disparity_map = None # disparity map
    self._depth_map = None # depth map

    TypeError:_int_()missing 3 required positional arguments:'num_disparities', 'window_size',and'baseline' というエラーが発生してしまいました。
    申し訳ございませんが、どのように対処すべきか教えていただけたら幸いです。
  3. 図を出力したときはどのようなコードを実行したのですか?
    DepthEstimatorクラスの使い方はわかりませんので答えることができません。

    エラーの解決法ですが、引数の値をちゃんと入れてください。

    depth_estimator = DepthEstimator(num_disparities, window_size, baseline)
  4. @tomo0415

    Questioner

    不正確になってしまい申し訳ございません。
    こちらの方のコードを使わせていただいています。
    https://github.com/shun74/Fisheye-Depth-Estimation
    このコードに、print(self._depth_map[222,202])を追加して、指定した座標での値をprintで出力しようと試みています。
    class DepthEstimator()はclass DepthEstimation.pyのコードで、
    depth_estimator = DepthEstimator(num_disparities, window_size, baseline)
    depth_map = depth_estimator.depth_estimation()
    print(depth_map[222,202])はrun.pyのコードの最後に追加しました。
    分かりにくくなってしまい、申し訳ございません。




  5. @tomo0415

    Questioner

    おかげさまで、うまくできました。
    本当にありがとうございました!

インデントは次の通りでしょうか?

def depth_estimation(self, axis="vertical",threshold=(0.0,2.0), save=None, show=True):
       assert self._disparity_map is not None, "Plz run stereo
       ...
       return self._depth_map
    
   print(self._depth_map[222,202])

   def _show_images(self, images, titles, figsize, subplot, color_bar=False):
       ...
       plt.show()

1Like

Comments

  1. @tomo0415

    Questioner

    ありがとうございます。
    正しくコピーできておらず、下の方のインデントでした。

Your answer might help someone💌