前提・実現したいこと
ここに質問の内容を詳しく書いてください。
C++からopenCVのconnectedCompenentsを使って、ビットマップ (0か1を要素とする2次元配列)の連結領域のラベリングをしたいと考えています。
■■な機能を実装中に以下のエラーメッセージが発生しました。
発生している問題・エラーメッセージ
よくネットに上がっているように、pngファイルをcv::Matに読み込んで、ビットマップに変換して、connectedComponentsを使うとうまくいきます。
しかし、cv::Matを2次元行列として、zerosで生成し、.at<int>(i,j)で0または1を代入したものをconnectedComponentsの引数とするとエラーが起きます。
この違いがわかりません。お教えいただけますでしょうか。
エラーメッセージ libc++abi.dylib: terminating with uncaught exception of type cv::Exception: OpenCV(4.1.0) /tmp/opencv-20190425-50155-10jr8ap/opencv-4.1.0/modules/imgproc/src/connectedcomponents.cpp:3936: error: (-215:Assertion failed) iDepth == CV_8U || iDepth == CV_8S in function 'connectedComponents_sub1' Abort trap: 6 ### 該当のソースコード (うまくいかないソースコード) // m : connectedComponentsの第1引数 cv::Mat m=cv::Mat::zeros(Nx,Ny,CV_32S); // m2 : connectedComponentsの第2引数 cv::Mat m2(m.size(),CV_32S); //matrix1(ビットマップ)のデータを m に代入 for (size_t i = 0; i < Nx; i++) { for (size_t j = 0; j < Ny; j++) { m.at<double>(i,j) = matrix1[mi(i,j)]; } } // connectedComponetns int n = cv::connectedComponents ( m,m2,4,CV_32S ); C++ ソースコード (うまくいくソースコード) // pngファイルのMatだとエラーにならない cv::Matsrc=cv::imread("pngfile/fixed_eqphiAkaiN_60_fn_10.png",cv::IMREAD_GRAYSCALE); cv::Mat bin; cv::threshold(src, bin, 0, 1, cv::THRESH_BINARY | cv::THRESH_OTSU); cv::Mat labelImage(src.size(), CV_32S); int nLabels = cv::connectedComponents(bin, labelImage, 8); ### 試したこと 先に述べたように最初から用意した2次元ビットマップではうまくいかなかったので、画像を読み込んでopenCVの関数を使って生成したビットマップだとうまくいった。 ### 補足情報(FW/ツールのバージョンなど) ここにより詳細な情報を記載してください。

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/04/30 04:23