質問
swift内部の処理を簡潔にするために構造体の生成部分を関数にしたときにエラーが起きます。
今回はopenCVラップしてを用いてます。
表示されるエラー
libc++abi.dylib: terminating with uncaught exception of type cv::Exception: OpenCV(4.2.0) /Volumes/build-storage/build/master_iOS-mac/opencv/modules/imgproc/src/color.simd_helpers.hpp:92: error: (-2:Unspecified error) in function 'cv::impl::(anonymous namespace)::CvtHelper<cv::impl::(anonymous namespace)::Set<3, 4, -1>, cv::impl::(anonymous namespace)::Set<1, -1, -1>, cv::impl::(anonymous namespace)::Set<0, 2, 5>, cv::impl::(anonymous namespace)::NONE>::CvtHelper(cv::InputArray, cv::OutputArray, int) [VScn = cv::impl::(anonymous namespace)::Set<3, 4, -1>, VDcn = cv::impl::(anonymous namespace)::Set<1, -1, -1>, VDepth = cv::impl::(anonymous namespace)::Set<0, 2, 5>, sizePolicy = cv::impl::(anonymous namespace)::NONE]' > Invalid number of channels in input image: > 'VScn::contains(scn)' > where > 'scn' is 1
具体的にやった事
以下のコードで構造体を生成するまでの部分を関数にしてしまおうと考えました。
入力画像に対してグレースケール化した時のヒストグラム(構造体)を生成するだけの関数です。
これを呼び出して動かしても問題ありません。
openCVWrapper.mm
C++
1+(void) makeHistgramFromImage:(UIImage *)image 2{ 3 // transform UIImagge to cv::Mat 4 // transform the cv::Mat color image to gray 5 cv::Mat imageMat; 6 UIImageToMat(image, imageMat); 7 cv::Mat grayMat; 8 cv::cvtColor (imageMat, grayMat, CV_BGR2GRAY); 9 image = MatToUIImage(grayMat); 10 // 画像の読み込み 11 IplImage *gray = [OpenCVManager createGrayIplImageFromUIImage:image]; //これは自分で作った関数 12 //ヒストグラムの階級数 13 float range[]={0,255}; 14 //ヒストグラムを保存するための配列 15 float* ranges[]={range}; 16 int histSize; 17 histSize=256; 18 CvHistogram* hist; 19 //ヒストグラムの生成 20 hist=cvCreateHist(1,&histSize,CV_HIST_ARRAY,ranges,1); 21 //ヒストグラムの計算 22 cvCalcHist(&gray,hist,0,NULL); 23 24 cvReleaseImage(&gray); 25}
これを単純に
C++
1+(CvHisogram*) makeHistgramFromImage:(UIImage *)image 2{ 3 // transform UIImagge to cv::Mat 4 // transform the cv::Mat color image to gray 5 cv::Mat imageMat; 6 UIImageToMat(image, imageMat); 7 cv::Mat grayMat; 8 cv::cvtColor (imageMat, grayMat, CV_BGR2GRAY); 9 image = MatToUIImage(grayMat); 10 // 画像の読み込み 11 IplImage *gray = [OpenCVManager createGrayIplImageFromUIImage:image]; //これは自分で作った関数 12 //ヒストグラムの階級数 13 float range[]={0,255}; 14 //ヒストグラムを保存するための配列 15 float* ranges[]={range}; 16 int histSize; 17 histSize=256; 18 CvHistogram* hist; 19 //ヒストグラムの生成 20 hist=cvCreateHist(1,&histSize,CV_HIST_ARRAY,ranges,1); 21 //ヒストグラムの計算 22 cvCalcHist(&gray,hist,0,NULL); 23 24 cvReleaseImage(&gray); 25 return hist; 26}
しかし、この関数化したものを呼び出してみると、(以下のは例です)
C++
1+(void) justForExample:(UIImage *)image 2{ 3 CvHistogram *hist = [openCVWrapper makeHistgramFromImage: image]; 4}
上記のエラーが起きます。
やったこととしてはただ関数化してそれをそのまま呼び出しただけなので全く同じことをしているのですが....
ご教示いただけましたら幸いです。
回答1件
あなたの回答
tips
プレビュー