菜鸟教程小白 发表于 2022-12-13 16:45:45

iOS opencv洪水填充错误


                                            <p><p>我正在尝试将我的 C++ opencv 应用程序移植到 iOs,
但我总是收到这个错误:</p>

<pre><code>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
</code></pre>

<p>这是我的代码:</p>

<pre><code>- (cv::MatND)calc_Hist
{

    using namespace cv;
    UIImage *temp = ;
    Mat src = ;
    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 &lt;&lt; 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 = ;
    ;

    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( &amp;hsv, 1, channels, mask, hist, 2, histSize, ranges, true, false );
    normalize( hist, hist, 0, 255, cv::NORM_MINMAX, -1, cv::Mat() );
    return hist;

}
</code></pre>

<p>这个功能在我的Mac上运行良好,所以我首先认为图像没有正确转换,但是如果我在UIImageView中显示它会显示图像。</p>

<p>这是转换方法</p>

<pre><code>- (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 todata
                                                    cols,                     // Width of bitmap
                                                    rows,                     // Height of bitmap
                                                    8,                        // Bits per component
                                                    cvMat.step,            // 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;
}
</code></pre>

<p>与“正常”框架相比,iOS 框架是否有所减少?
我用谷歌搜索,但没有找到任何可以解决我的问题的东西。</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>我在 Android 上遇到了完全相同的问题。就我而言,“问题”是我只是将 BGRA 与 BGR 混为一谈。在我的例子中,floodfill 的输入/输出矩阵应该有 3 个 channel ,但我不小心给出了一个有 4 个 channel 的矩阵(BGRA)。我想同样的问题也发生在你身上。 </p>

<p>这件事发生在我身上,因为我是从 Android OpenCV SDK 的教程代码“混合处理 2”开始的。有一个误导性的名称(第 4 个 channel 就消失了):</p>

<pre><code>Mat&amp; mRgb = *(Mat*)addrRgba;
</code></pre>

<p>我必须将 4channel 矩阵转换为 3channel 矩阵,然后 Floodfill 工作正常。 </p></p>
                                   
                                                <p style="font-size: 20px;">关于iOS opencv洪水填充错误,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/12785221/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/12785221/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: iOS opencv洪水填充错误