2

C ++ opencvアプリをiOSに移植しようとしていますが、常にこのエラーが発生します:

OpenCV Error: Unsupported format or combination of formats () in cvFloodFill, file /Users/user/slave/ios_framework/src/opencv/modules/imgproc/src/floodfill.cpp, line 618
libc++abi.dylib: terminate called throwing an exception

これが私のコードです:

- (cv::MatND)calc_Hist
{

    using namespace cv;
    UIImage *temp = [UIImage imageNamed:@"file.png"];
    Mat src = [self cvMatFromUIImage:temp];
    Mat hsv;
    Mat mask;
    MatND hist;
    int lo = 151; int up = 170;
    cv::Point seed = cv::Point( 1029, 270 );
    int newMaskVal = 255;
    Scalar newVal = Scalar( 120, 120, 120 );
    int connectivity = 8;

    int h_bins = 30; int s_bins = 32;
    int histSize[] = { h_bins, s_bins };
    float h_range[] = { 0, 179 };
    float s_range[] = { 0, 255 };
    const float* ranges[] = { h_range, s_range };
    int channels[] = { 0, 1 };

    cvtColor(src, hsv, CV_BGR2HSV);
    int flags = connectivity + (newMaskVal << 8 ) + cv::FLOODFILL_FIXED_RANGE + cv::FLOODFILL_MASK_ONLY;
    cv::Mat mask2 = cv::Mat::zeros( src.rows + 2, src.cols + 2, CV_8UC1 );

    UIImage *imgs = [self UIImageFromCVMat:hsv];
    [_viewer setImage:imgs];

    floodFill( src, mask2, seed, newVal, 0, cv::Scalar( lo, lo, lo ), cv::Scalar( up, up, up), flags );

    mask = mask2( cv::Range( 1, mask2.rows - 1 ), cv::Range( 1, mask2.cols - 1 ) );
    calcHist( &hsv, 1, channels, mask, hist, 2, histSize, ranges, true, false );
    normalize( hist, hist, 0, 255, cv::NORM_MINMAX, -1, cv::Mat() );
    return hist;

}

この機能は私のMacでは正常に機能するので、最初は画像が正しく変換されていないと思いましたが、UIImageViewに表示すると画像が表示されます。

変換方法は次のとおりです

- (cv::Mat)cvMatFromUIImage:(UIImage *)image
{
    CGColorSpaceRef colorSpace = CGImageGetColorSpace(image.CGImage);
    CGFloat cols = image.size.width;
    CGFloat rows = image.size.height;

    cv::Mat cvMat(rows, cols, CV_8UC4); // 8 bits per component, 4 channels

    CGContextRef contextRef = CGBitmapContextCreate(cvMat.data,                 // Pointer to  data
                                                    cols,                       // Width of bitmap
                                                    rows,                       // Height of bitmap
                                                    8,                          // Bits per component
                                                    cvMat.step[0],              // Bytes per row
                                                    colorSpace,                 // Colorspace
                                                    kCGImageAlphaNoneSkipLast |
                                                    kCGBitmapByteOrderDefault); // Bitmap info flags

    CGContextDrawImage(contextRef, CGRectMake(0, 0, cols, rows), image.CGImage);
    CGContextRelease(contextRef);
    CGColorSpaceRelease(colorSpace);

    return cvMat;
}

iOSフレームワークは、「通常の」フレームワークと比較して何らかの形で削減されていますか?グーグルで検索しましたが、問題を解決するものが見つかりませんでした。

4

2 に答える 2

2

Androidでもまったく同じ問題がありました。私の場合の「問題」は、BGRA と BGR を混同したことです。私の場合、floodfill の in/out マトリックスには 3 つのチャネルが必要ですが、誤って 4 つのチャネル (BGRA) を持つマトリックスを指定してしまいました。同じ問題があなたに起こったと思います。

Android OpenCV SDKのチュートリアルコード「Mixed Processing 2」から始めたのでたまたま。紛らわしい名前があります (4 番目のチャンネルが消えるだけです)。

Mat& mRgb = *(Mat*)addrRgba;

4 チャネル マトリックスを 3 チャネル マトリックスに変換する必要があり、フラッドフィルは正常に機能しました。

于 2014-04-09T13:18:52.440 に答える
1

このエラーは、関数が処理できないタイプの行列に遭遇したときに発生します。src.type() を使用して、floodFill の入力行列の型を調べます。OpenCVのマニュアルによると

image – 入力/出力 1 または 3 チャネル、8 ビットまたは浮動小数点イメージ。FLOODFILL_MASK_ONLY フラグが設定されていない限り、関数によって変更されます (関数の 2 番目のバリアントで、以下を参照)。

于 2012-10-08T16:59:11.660 に答える