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

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

ただいまの
回答率

91.87%

  • Xcode

    2273questions

    Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

  • C++

    1934questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

  • OpenCV

    403questions

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

opencvのcvConvertScaleAbs関数エラーを直したい

解決済

回答 2

投稿 2016/01/05 14:54

  • 評価
  • クリップ 0
  • VIEW 1,175

nazu_yu

score 1

こんにちは。
どうしても解決できず、ずっと悩んでいるのでご助力いただけないかと思い投稿しました。

前提・実現したいこと

XcodeでC++、opencvを用いて行列操作をしています。
ある関数内で、メイン関数から受け取ったMat型in_img(CV_64F)を、Mat型tmp(CV_8UC1)に正規化したいです。
Mat型in_imgには例えば[700,400,800,550]のような行列で、0〜255の範囲外の値があります。
これを0〜255の範囲に直し、Mat型tmpに出力しようとしています。
が、うまくいきません…。
どのように直せば正規化が行えるでしょうか?

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

下記のソースコードで動かすと、cvConvertScaleの部分でsingl SIGABRTになり止まってしまいます。
デバッグ画面には
OpenCV Error: Bad argument (Unknown array type) in cvarrToMat
が出力されます。

ソースコード

void convert(const int a, Mat& in_img, Mat& out_img, int mode){ 
        cout << "isContinuous:" << (in_img.isContinuous()?"true":"false") << endl;
        cout << "channels: " << in_img.channels() << endl; // チャンネル数を表示
        cout << "depth (ID):" << in_img.depth() << "(=" << CV_64F << ")" << endl;
        cout << in_img.rows << "  " << in_img.cols << endl;
        double minVal, maxVal;
        Point minLoc, maxLoc;
        minMaxLoc(in_img, &minVal, &maxVal, &minLoc, &maxLoc);
Mat tmp;
       cvConvertScale(&in_img, &tmp, 255.0/(maxVal-minVal), (255.0/(maxVal-minVal))*(-minVal));
        cout << "tmp: " << tmp;
}

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

デバッグ画面出力内容
isContinuous:true
channels: 1
depth (ID):6(=6)
1  3264
OpenCV Error: Bad argument (Unknown array type) in cvarrToMat

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

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

    クリップした質問はマイページの「クリップ」タブからいつでも見ることができます。

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

checkベストアンサー

0

まだ見てるのかな、いいや、暇つぶしに調べただけなので。

cv::Mat::convertToでいい気がするのですが・・・。
ex.)http://docs.opencv.org/3.1.0/de/dc7/fitellipse_8cpp-example.html#a14&gsc.tab=0

#include <opencv2/core/core.hpp>
#include <iostream>
#include <vector>
cv::Mat rescale_to_8bit(const cv::Mat& in) {
    double minVal, maxVal;
    cv::minMaxLoc(in, &minVal, &maxVal);
    cv::Mat re;
    in.convertTo(re, CV_8U, 255.0 / (maxVal - minVal), (255.0 / (maxVal - minVal))*(-minVal));
    return re;
}
int main(int argc, const char* argv[])
{
    std::vector<int> src_v = { 700,400,800,550 };
    using std::endl;
    auto src_m = cv::Mat(src_v);
    std::cout << src_m << std::endl;
    std::cout << rescale_to_8bit(src_m) << std::endl;
    return 0;
}
[700;
 400;
 800;
 550]
[191;
   0;
 255;
  96]

検証環境はVisual Studio 2015 Update 1 OpenCV 3.1 自前ビルド

General configuration for OpenCV 3.1.0 =====================================
  Version control:               unknown

  Platform:
    Host:                        Windows 6.1.7601 AMD64
    CMake:                       3.4.1
    CMake generator:             Visual Studio 14 2015
    CMake build tool:            C:/Program Files (x86)/MSBuild/14.0/bin/MSBuild
.exe
    MSVC:                        1900

  C/C++:
    Built as dynamic libs?:      YES
    C++ Compiler:                C:/Program Files (x86)/Microsoft Visual Studio
14.0/VC/bin/cl.exe  (ver 19.0.23506.0)
    C++ flags (Release):         /DWIN32 /D_WINDOWS /W4 /GR /EHa  /D _CRT_SECURE
_NO_DEPRECATE /D _CRT_NONSTDC_NO_DEPRECATE /D _SCL_SECURE_NO_WARNINGS /Gy /bigob
j /arch:SSE2 /Oi /fp:fast  /wd4251 /wd4324 /wd4275 /wd4589 /MP4  /MD /O2 /Ob2 /D
 NDEBUG  /Zi
    C++ flags (Debug):           /DWIN32 /D_WINDOWS /W4 /GR /EHa  /D _CRT_SECURE
_NO_DEPRECATE /D _CRT_NONSTDC_NO_DEPRECATE /D _SCL_SECURE_NO_WARNINGS /Gy /bigob
j /arch:SSE2 /Oi /fp:fast  /wd4251 /wd4324 /wd4275 /wd4589 /MP4  /D_DEBUG /MDd /
Zi /Ob0 /Od /RTC1
    C Compiler:                  C:/Program Files (x86)/Microsoft Visual Studio
14.0/VC/bin/cl.exe
    C flags (Release):           /DWIN32 /D_WINDOWS /W3  /D _CRT_SECURE_NO_DEPRE
CATE /D _CRT_NONSTDC_NO_DEPRECATE /D _SCL_SECURE_NO_WARNINGS /Gy /bigobj /arch:S
SE2 /Oi /fp:fast    /MP4  /MD /O2 /Ob2 /D NDEBUG  /Zi
    C flags (Debug):             /DWIN32 /D_WINDOWS /W3  /D _CRT_SECURE_NO_DEPRE
CATE /D _CRT_NONSTDC_NO_DEPRECATE /D _SCL_SECURE_NO_WARNINGS /Gy /bigobj /arch:S
SE2 /Oi /fp:fast    /MP4  /D_DEBUG /MDd /Zi /Ob0 /Od /RTC1
    Linker flags (Release):      /machine:X86  /INCREMENTAL:NO  /debug
    Linker flags (Debug):        /machine:X86  /debug /INCREMENTAL
    Precompiled headers:         YES
    Extra dependencies:          comctl32 gdi32 ole32 setupapi ws2_32 vfw32
    3rdparty dependencies:       zlib libjpeg libwebp libpng libtiff libjasper I
lmImf

  OpenCV modules:
    To be built:                 core flann imgproc ml photo video imgcodecs sha
pe videoio highgui objdetect superres ts features2d calib3d stitching videostab
python3
    Disabled:                    python2 world
    Disabled by dependency:      -
    Unavailable:                 cudaarithm cudabgsegm cudacodec cudafeatures2d
cudafilters cudaimgproc cudalegacy cudaobjdetect cudaoptflow cudastereo cudawarp
ing cudev java viz

  Windows RT support:            NO

  GUI:
    QT:                          NO
    Win32 UI:                    YES
    OpenGL support:              NO
    VTK support:                 NO

  Media I/O:
    ZLib:                        build (ver 1.2.8)
    JPEG:                        build (ver 90)
    WEBP:                        build (ver 0.3.1)
    PNG:                         build (ver 1.6.19)
    TIFF:                        build (ver 42 - 4.0.2)
    JPEG 2000:                   build (ver 1.900.1)
    OpenEXR:                     build (ver 1.7.1)
    GDAL:                        NO

  Video I/O:
    Video for Windows:           YES
    DC1394 1.x:                  NO
    DC1394 2.x:                  NO
    FFMPEG:                      YES (prebuilt binaries)
      codec:                     YES (ver 56.41.100)
      format:                    YES (ver 56.36.101)
      util:                      YES (ver 54.27.100)
      swscale:                   YES (ver 3.1.101)
      resample:                  NO
      gentoo-style:              YES
    GStreamer:                   NO
    OpenNI:                      NO
    OpenNI PrimeSensor Modules:  NO
    OpenNI2:                     NO
    PvAPI:                       NO
    GigEVisionSDK:               NO
    DirectShow:                  YES
    Media Foundation:            NO
    XIMEA:                       NO
    Intel PerC:                  NO

  Parallel framework:            TBB (ver 4.4 interface 9002)

  Other third-party libraries:
    Use IPP:                     9.0.1 [9.0.1]
         at:                     C:/lib/opencv-3.1.0/3rdparty/ippicv/unpack/ippi
cv_win
    Use IPP Async:               NO
    Use Eigen:                   YES (ver 3.2.7)
    Use Cuda:                    NO
    Use OpenCL:                  YES
    Use custom HAL:              NO

  OpenCL:
    Version:                     dynamic
    Include path:                C:/lib/opencv-3.1.0/3rdparty/include/opencl/1.2

    Use AMDFFT:                  NO
    Use AMDBLAS:                 NO

  Python 2:
    Interpreter:                 C:/Python34/python.exe (ver 3.4.4)

  Python 3:
    Interpreter:                 C:/Python34/python.exe (ver 3.4.4)
    Libraries:                   C:/Python34/libs/python34.lib (ver 3.4.4)
    numpy:                       C:/Python34/lib/site-packages/numpy/core/includ
e (ver 1.10.2)
    packages path:               C:/Python34/Lib/site-packages

  Python (for build):            C:/Python34/python.exe

  Java:
    ant:                         NO
    JNI:                         NO
    Java wrappers:               NO
    Java tests:                  NO

  Matlab:                        Matlab not found or implicitly disabled

  Documentation:
    Doxygen:                     D:/Program1/doxygen-1.8.10.windows.x64.bin/doxy
gen.exe (ver 1.8.10)
    PlantUML:                    NO

  Tests and samples:
    Tests:                       YES
    Performance tests:           YES
    C/C++ Examples:              NO

  Install path:                  C:/lib/opencv-3.1.0/build/install

  cvconfig.h is in:              C:/lib/opencv-3.1.0/build
-----------------------------------------------------------------


ちなみにcvConvertScaleがうまく行かなかったのは、3.xで廃止されたC-stype APIの関数だからcv::Matへのポインタを渡されることが想定外だったのでしょう。

投稿 2016/01/22 01:41

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

    以下のような回答は評価を下げられます

    • 間違っている回答
    • 質問の回答になっていない投稿
    • 不快な投稿

    評価を下げる際はその理由をコメントに書き込んでください。

  • 2016/01/23 19:35

    convertTo関数でできました!
    バージョンによっては廃止された関数だったのですね…本当に助かりました、ありがとうございます。

    キャンセル

0

こんにちは。

cvConvertScale()の第一引数は行列へのポインタです。
ご提示されたソースでは「行列のポインタへのポインタ」になっているようです。


【ところで】
OpenCV 2.4.9で確認したのですが、cvConvertScale()の第一引数はconst CvArr* srcです。
そして、typedef void CvArr;と定義してあります。つまり、ポインタなら何を書いてもコンパイル・エラーにならないようです。

投稿 2016/01/05 15:29

編集 2016/01/05 15:45

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

    以下のような回答は評価を下げられます

    • 間違っている回答
    • 質問の回答になっていない投稿
    • 不快な投稿

    評価を下げる際はその理由をコメントに書き込んでください。

  • 2016/01/05 15:56

    なるほど、確かにポインタのポインタになってしまっていますね…。見落としていました。
    重ね重ね申し訳ないのですが、これをどのように直せばエラーがなくなるのでしょうか…?不慣れで申し訳ありません。下記のようにしてみても、ダメでした。("in_img"にすればポインタのポインタにはならないと思ったのですが…)
    cvConvertScale(in_img, &tmp, 255.0/(maxVal-minVal), (255.0/(maxVal-minVal))*(-minVal));

    キャンセル

  • 2016/01/05 16:24

    修正そのものはそれでよいように思います。
    エラー・メッセージに変化ないでしょうか?

    ところで、tmpに行列を設定しておく必要があるのかも知れません。
    in_imgと同じ型の行列を設定してみては如何でしょうか?

    OpenCVを触っていたのは随分昔なので記憶が曖昧なのです。すいません。

    キャンセル

  • 2016/01/05 17:03

    ありがとうございます。
    先ほどのように書き、tmpに行列を設定してみました。
    Mat tmp(1, in_img.cols, CV_64F); //tmp設定
    cvConvertScale(in_img, &tmp, 255.0/(maxVal-minVal), (255.0/(maxVal-minVal))*(-minVal));

    前のものだと、build sucessになり落ちていたのですが、上の場合だとbuild failedになりました。
    cvConvertScaleの行にsingl SIGABRTとエラーが出ていたのが、"no matching function for call to 'cvConvertScale' "がでるようになりました。
    何が悪いのでしょう…?引数は合っていると思うのですが…。

    キャンセル

  • 2016/01/05 17:45

    cvConvertScale()の行は修正せず、Mat tmpの行しか修正していないのですよね?
    それで、cvConvertScale()が該当関数無しになる原因は思いつきません。

    Mat tmp;に戻しても同じコンパイル・エラーになりませんか?
    もし、YESなら、何かタイプミスをされていると思います。良く見なおしてみると良いように思います。

    キャンセル

  • 2016/01/07 17:36

    Mat tmpを修正した場合/していない場合と試してみましたが、該当関数なしのエラーは治りませんでした。
    同じコンパイル・エラーが起きているので、私が何かミスをしているのかと思います。
    お手数おかけしてすみません。ありがとうございました。

    キャンセル

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

ただいまの回答率

91.87%

関連した質問

  • 受付中

    OpenCVで動画の読み込みがうまくできません。

    以前別のプログラムで動画の読み込みができましたが、今現在取り組んでいるプログラムではうまくいきません。 言語はC++でopencv2.4.9を使用しています。 Os windo

  • 受付中

    OpenCVで動画の読み込みがうまくできません。

    以前別のプログラムで動画の読み込みができましたが、今現在取り組んでいるプログラムではうまくいきません。   言語はC++を使用しています。  ・ソースコード  ヘッダファ

  • 解決済

    byte配列のcv::Matへの画像変換

    byte配列に格納している画像データをMatに画像配列として保存します。この時、cv::imdecodeを使用しています。その後に画素値の変換をかけてcv::imencodeで再び

  • 解決済

    OpenCV for UnityでwebCamTextureToMatできない

    OpenCV for Unityを使ってウェブカメラの画像をいじろうとしているのですが、WebCamTextureをMatに変換しようとするときに出るエラーが解決できずにいます。

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

  • Xcode

    2273questions

    Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

  • C++

    1934questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

  • OpenCV

    403questions

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

閲覧数の多いC++の質問