opencv_contrib icon indicating copy to clipboard operation
opencv_contrib copied to clipboard

wechat_qrcode crash about dnn

Open DoubleHeartLi opened this issue 3 years ago • 3 comments

System information (version)
  • OpenCV => 4.1.1
  • Operating System / Platform => iOS10+
  • Compiler => Xcode
Detailed description

Here's crash data from Bugly, in more than one case. Can anyone know why and how to solve the problem, please

0 cv::error(cv::Exception const&) + 252
1 cv::error(int, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, char const*, char const*, int) + 316
2 cv::_InputArray::type(int) const + 732
3 cv::_InputArray::depth(int) const + 12
4 cv::dnn::ConvolutionLayerImpl::forward(cv::_InputArray const&, cv::_OutputArray const&, cv::_OutputArray const&) + 108
5 cv::dnn::dnn4_v20190621::Net::Impl::forwardLayer(cv::dnn::dnn4_v20190621::LayerData&) + 1344
6 cv::dnn::dnn4_v20190621::Net::Impl::forwardToLayer(cv::dnn::dnn4_v20190621::LayerData&, bool) + 224
7 cv::dnn::dnn4_v20190621::Net::forward(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) + 292
8 cv::wechat_qrcode::SSDDetector::forward(cv::Mat, int, int) (string:1423)
9 cv::wechat_qrcode::WeChatQRCode::Impl::applyDetector(cv::Mat const&, std::__1::vector<cv::Mat, std::__1::allocator<cv::Mat> >&) (vector:1387)
10 cv::wechat_qrcode::WeChatQRCode::Impl::detect(cv::Mat const&) (wechat_qrcode.cpp:0)
11 cv::wechat_qrcode::WeChatQRCode::detectAndDecode(cv::_InputArray const&, cv::_OutputArray const&) (vector:658)
12 WeChatScan::scanByWeChat(cv::Mat, std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > >&, std::__1::vector<cv::Mat, std::__1::allocator<cv::Mat> >&) (vector:1387)
0 cv::error(cv::Exception const&) + 252
1 cv::error(int, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, char const*, char const*, int) + 316
2 cv::dnn::dnn4_v20190621::BlobManager::addHost(cv::dnn::dnn4_v20190621::LayerPin const&, cv::Mat const&) + 632
3 cv::dnn::dnn4_v20190621::BlobManager::reuseOrCreate(std::__1::vector<int, std::__1::allocator<int> > const&, cv::dnn::dnn4_v20190621::LayerPin const&, cv::Mat&, bool) + 2416
4 cv::dnn::dnn4_v20190621::Net::Impl::allocateLayer(int, std::__1::map<int, cv::dnn::dnn4_v20190621::(anonymous namespace)::LayerShapes, std::__1::less<int>, std::__1::allocator<std::__1::pair<int const, cv::dnn::dnn4_v20190621::(anonymous namespace)::LayerShapes> > > const&) + 3412
5 cv::dnn::dnn4_v20190621::Net::Impl::allocateLayers(std::__1::vector<cv::dnn::dnn4_v20190621::LayerPin, std::__1::allocator<cv::dnn::dnn4_v20190621::LayerPin> > const&) + 1944
6 cv::dnn::dnn4_v20190621::Net::Impl::setUpNet(std::__1::vector<cv::dnn::dnn4_v20190621::LayerPin, std::__1::allocator<cv::dnn::dnn4_v20190621::LayerPin> > const&) + 552
7 cv::dnn::dnn4_v20190621::Net::forward(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) + 260
8 cv::wechat_qrcode::SSDDetector::forward(cv::Mat, int, int) (string:1423)
9 cv::wechat_qrcode::WeChatQRCode::Impl::applyDetector(cv::Mat const&, std::__1::vector<cv::Mat, std::__1::allocator<cv::Mat> >&) (vector:1387)
10 cv::wechat_qrcode::WeChatQRCode::Impl::detect(cv::Mat const&) (wechat_qrcode.cpp:0)
11 cv::wechat_qrcode::WeChatQRCode::detectAndDecode(cv::_InputArray const&, cv::_OutputArray const&) (vector:658)
12 WeChatScan::scanByWeChat(cv::Mat, std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > >&, std::__1::vector<cv::Mat, std::__1::allocator<cv::Mat> >&) (vector:1387)
0 cv::error(cv::Exception const&) + 252
1 cv::error(int, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, char const*, char const*, int) + 316
2 void cv::detail::check_failed_auto_<int>(int const&, cv::detail::CheckContext const&) + 688
3 cv::cpu_baseline::cvt8u(unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned char*, unsigned long, cv::Size_<int>, void*)
4 cv::dnn::EltwiseLayerImpl::EltwiseInvoker::run(cv::Mat const*, int, cv::Mat&, std::__1::vector<float, std::__1::allocator<float> > const&, cv::dnn::EltwiseLayerImpl::EltwiseOp, cv::dnn::dnn4_v20190621::ActivationLayer const*, int) + 1060
5 cv::dnn::EltwiseLayerImpl::forward(cv::_InputArray const&, cv::_OutputArray const&, cv::_OutputArray const&) + 244
6 cv::dnn::dnn4_v20190621::Net::Impl::forwardLayer(cv::dnn::dnn4_v20190621::LayerData&) + 1344
7 cv::dnn::dnn4_v20190621::Net::Impl::forwardToLayer(cv::dnn::dnn4_v20190621::LayerData&, bool) + 224
8 cv::dnn::dnn4_v20190621::Net::forward(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) + 292
9 cv::wechat_qrcode::SSDDetector::forward(cv::Mat, int, int) (string:1423)
10 cv::wechat_qrcode::WeChatQRCode::Impl::applyDetector(cv::Mat const&, std::__1::vector<cv::Mat, std::__1::allocator<cv::Mat> >&) (vector:1387)
11 cv::wechat_qrcode::WeChatQRCode::Impl::detect(cv::Mat const&) (wechat_qrcode.cpp:0)
12 cv::wechat_qrcode::WeChatQRCode::detectAndDecode(cv::_InputArray const&, cv::_OutputArray const&) (vector:658)
13 WeChatScan::scanByWeChat(cv::Mat, std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > >&, std::__1::vector<cv::Mat, std::__1::allocator<cv::Mat> >&) (vector:1387)
0 cv::error(cv::Exception const&) + 252
1 cv::error(int, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, char const*, char const*, int) + 316
2 cv::dnn::PermuteLayerImpl::forward(cv::_InputArray const&, cv::_OutputArray const&, cv::_OutputArray const&) + 1956
3 cv::dnn::dnn4_v20190621::Net::Impl::forwardLayer(cv::dnn::dnn4_v20190621::LayerData&) + 1344
4 cv::dnn::dnn4_v20190621::Net::Impl::forwardToLayer(cv::dnn::dnn4_v20190621::LayerData&, bool) + 224
5 cv::dnn::dnn4_v20190621::Net::forward(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) + 292
6 cv::wechat_qrcode::SSDDetector::forward(cv::Mat, int, int) (string:1423)
7 cv::wechat_qrcode::WeChatQRCode::Impl::applyDetector(cv::Mat const&, std::__1::vector<cv::Mat, std::__1::allocator<cv::Mat> >&) (vector:1387)
8 cv::wechat_qrcode::WeChatQRCode::Impl::detect(cv::Mat const&) (wechat_qrcode.cpp:0)
9 cv::wechat_qrcode::WeChatQRCode::detectAndDecode(cv::_InputArray const&, cv::_OutputArray const&) (vector:658)
10 WeChatScan::scanByWeChat(cv::Mat, std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > >&, std::__1::vector<cv::Mat, std::__1::allocator<cv::Mat> >&) (vector:1387)
0 cv::error(cv::Exception const&) + 252
1 cv::error(int, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, char const*, char const*, int) + 316
2 cv::dnn::SoftMaxLayerImpl::forward(cv::_InputArray const&, cv::_OutputArray const&, cv::_OutputArray const&) + 3644
3 cv::dnn::dnn4_v20190621::Net::Impl::forwardLayer(cv::dnn::dnn4_v20190621::LayerData&) + 1344
4 cv::dnn::dnn4_v20190621::Net::Impl::forwardToLayer(cv::dnn::dnn4_v20190621::LayerData&, bool) + 224
5 cv::dnn::dnn4_v20190621::Net::forward(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) + 292
6 cv::wechat_qrcode::SSDDetector::forward(cv::Mat, int, int) (string:1423)
7 cv::wechat_qrcode::WeChatQRCode::Impl::applyDetector(cv::Mat const&, std::__1::vector<cv::Mat, std::__1::allocator<cv::Mat> >&) (vector:1387)
8 cv::wechat_qrcode::WeChatQRCode::Impl::detect(cv::Mat const&) (wechat_qrcode.cpp:0)
9 cv::wechat_qrcode::WeChatQRCode::detectAndDecode(cv::_InputArray const&, cv::_OutputArray const&) (vector:658)
10 WeChatScan::scanByWeChat(cv::Mat, std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > >&, std::__1::vector<cv::Mat, std::__1::allocator<cv::Mat> >&) (vector:1387)

DoubleHeartLi avatar May 20 '22 02:05 DoubleHeartLi

Need reproduction steps to help. Can you show how you called WeChatScan::scanByWeChat? How you called this function and what parameters you passed?. Are you using Objective-C or Swift? Are you using CocoaPods or something else?

tejasmr avatar May 20 '22 05:05 tejasmr

I use Objective-C, I copy wechat_qrcode codes in my project which depended OpenCV2 4.1.1 by CocoaPods. Works fine, But I see collapsing messages on Bugly occasionally @tezz-io

.mm文件
- (NSArray *)weChatQRcode:(UIImage *)image {
    // 图片转换
    cv::Mat matImage;
    UIImageToMat(image, matImage);
    if (matImage.empty()) {
        SFIM_QRENGINE_LOGGER(@"[wQRCode] 图片转换失败!");
        return nil;
    }
    
    // 四个模型位置
    // ...
    string detect_prototxt = [dp cStringUsingEncoding:NSUTF8StringEncoding];
    string detect_caffemodel = [dc cStringUsingEncoding:NSUTF8StringEncoding];
    string sr_prototxt = [sp cStringUsingEncoding:NSUTF8StringEncoding];
    string sr_caffemodel = [sc cStringUsingEncoding:NSUTF8StringEncoding];
    
    // 二维码识别
    vector<Mat> codePoints;
    vector<string> res;
    WeChatScan& instance = WeChatScan::get_instance(detect_prototxt, detect_caffemodel, sr_prototxt, sr_caffemodel);
    instance.scanByWeChat(matImage, res, codePoints);
    
    // 内容解析
    NSMutableArray *result = [NSMutableArray array];
    for (int i=0; i < res.size(); i++) {
        // 提取结果字符串
        string one = res[i];
        NSString *str = [NSString stringWithUTF8String:one.c_str()];
        // ...
    }
    return result;
}

C文件
static WeChatScan& get_instance(string dp, string dc, string sp, string sc){
    static WeChatScan instance;
    if (instance.detector == nullptr){
        try {
            instance.detector = makePtr<wechat_qrcode::WeChatQRCode>(dp, dc,
                                                                     sp, sc);
            //...
        }
        catch (const std::exception& e) {
            //...
        }
    }
    return instance;
}
void scanByWeChat(Mat inputImg, std::vector<std::string>& res1, vector<Mat>& res2) {
    vector<Mat> points;
    CV_WRAP std::vector<std::string> result;
    if (detector != nullptr) {
        result = detector->detectAndDecode(inputImg, points);
    }
    res1 = result;
    res2 = points;
}

DoubleHeartLi avatar May 20 '22 07:05 DoubleHeartLi

It is not a crash like SEGFAULT. It should be a C++ exception which is not handled probably. Try to handle it through "try-catch" (and try to extract error message of this exception)

alalek avatar May 20 '22 10:05 alalek