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

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

ただいまの
回答率

87.37%

std::vector<bool> がうまくいかない

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 818

score 7

前提・実現したいこと

std::vector<bool> を使ってコードを書いているのですが、no matching function となってしまいうまく行きません。
std::vector<bool> は使うべきではないと聞いたので std::vector<char> にしたり、単純に bool などにしましたがだめでした。
他に試すべきことがあればご教授いただきたいです。

発生している問題・エラーメッセージ

Eigen::Matrix3d minimizeTransform 内
ceres::CostFunction* cost =
        new ceres::AutoDiffCostFunction<CostFunc, 1, 9>
         (new CostFunc(source->at(i), target->at(closest[i]), weight[i]));

上記の一番最後のweight[i]に次のエラー

no matching function for call to ‘CostFunc::CostFunc(pcl::PointXYZ&, pcl::PointXYZ&, std::vector<bool>::reference)’

該当のソースコード

struct CostFunc
{
  CostFunc(const pcl::PointNormal source, const pcl::PointNormal target, const bool w)
      : source_(source), target_(target), w_(w) {}

  template <typename T>
  bool operator()(const T *const p, T *residual, const bool w)
  {
    T x = T(source_.x);
    T y = T(source_.y);
    T z = T(source_.z);

    pcl::PointXYZ Tb;
      Tb.x = p[0]*x+p[1]*y+p[2]*z+p[3];
      Tb.y = p[4]*x+p[5]*y+p[6]*z+p[7];
      Tb.z = p[8]*x+p[9]*y+p[10]*z+p[11];

      residual[0] = T(w?1:0)*T(sqrt(pow( (target_.x - Tb.x)*(target_.x - Tb.x) + (target_.y - Tb.y) * (target_.y - Tb.y) + (target_.z - Tb.z) * (target_.z - Tb.z), 0.5 )));
    return true;
  }

  private:
    pcl::PointNormal source_;
    pcl::PointNormal target_;
    double w_;
};
std::vector<bool> &weight → bool weight
Eigen::Matrix3d minimizeTransform(
 pcl::PointCloud<pcl::PointXYZ>::Ptr source,
 pcl::PointCloud<pcl::PointXYZ>::Ptr target,
 std::vector<int> &closest, 
 std::vector<bool> &weight)
{
  Eigen::Matrix3d matrix;
  ceres::Problem problem;
  std::vector<double> param(9, INITIAL_SURFACE_PARAMETER);
  for (int i = 0; i < target->size(); ++i)
  {
    ceres::CostFunction* cost =
        new ceres::AutoDiffCostFunction<CostFunc, 1, 9>(new CostFunc(
          source->at(i), 
          target->at(closest[i]), 
          weight[i]));
    problem.AddResidualBlock(cost, NULL, param.data());
  }

補足情報(FW/ツールのバージョンなど)

C++
Ceres Solver
Eigen
Point Cloud Library

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

std::vector<bool>云々ではなく、
source->at(i)target->at(closest[i])の型がコンストラクタの第1,第2引数の型と一致していないだけでは?


扱いたいデータがPointXYZであっているのであれば、
yohhoyさんのコメントにもあるように、以下のように修正すれば質問の箇所は通ると思います。

-  CostFunc(const pcl::PointNormal source, const pcl::PointNormal target, const bool w)
+  CostFunc(const pcl::PointXYZ source, const pcl::PointXYZ target, const bool w)
-    pcl::PointNormal source_;
-    pcl::PointNormal target_;
+    pcl::PointXYZ source_;
+    pcl::PointXYZ target_;

p[9]以降アクセスしていたり、w_boolではなくdoubleだったりと気になる点がありますが…
なにか元になるコードがあり、改造しているのでしょうか?

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/10/01 09:18

    回答ありがとうございます
    第一第二引数のことが頭から抜け落ちていたようです。
    試してみます。

    キャンセル

  • 2019/10/01 13:16

    いろいろ試してみましたが、どうしても引数の型が合いません。
    この場合考えられる引数は何かわかりますでしょうか?

    キャンセル

  • 2019/10/01 17:00

    実引数は pcl::PointXYZ 型なのに、CostFuncコンストラクタは pcl::PointNormal 型を要求していませんか。
    ここから先はPCLのドメイン知識が必要ですが、簡単に検索した限りでは PointXYZ は座標情報のみ、PointNormal は座標情報+他の情報 から構成されるため、質問中のコードは異なる概念のものを同一に扱おうとしているようです。(単に実装上の問題なのか、設計が誤っているのかまではわかりません)

    キャンセル

  • 2019/10/03 17:36

    yohhoyさん
    ありがとうございます。仰るとおりPointNormalとPointXYZが混在していました。
    PointXYZに統一してみます。

    キャンセル

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

  • ただいまの回答率 87.37%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る