Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ cv::resize()失败,出现访问冲突错误(由NULL处的<;struct>;引起)_C++_Opencv - Fatal编程技术网

C++ cv::resize()失败,出现访问冲突错误(由NULL处的<;struct>;引起)

C++ cv::resize()失败,出现访问冲突错误(由NULL处的<;struct>;引起),c++,opencv,C++,Opencv,这是, 我试图用opencv做一个简单的调整大小,结果崩溃了 这是发生访问冲突的示例代码: void Classifier::Preprocess(const cv::Mat& img, std::vector<cv::Mat>* input_channels) { /* Convert the input image to the input image format of the network. */ cv::Mat sample; if (im

这是,
我试图用opencv做一个简单的调整大小,结果崩溃了
这是发生访问冲突的示例代码:

void Classifier::Preprocess(const cv::Mat& img, std::vector<cv::Mat>* input_channels)
{
    /* Convert the input image to the input image format of the network. */
    cv::Mat sample;
    if (img.channels() == 3 && num_channels_ == 1)
        cv::cvtColor(img, sample, cv::COLOR_BGR2GRAY);
    else if (img.channels() == 4 && num_channels_ == 1)
        cv::cvtColor(img, sample, cv::COLOR_BGRA2GRAY);
    else if (img.channels() == 4 && num_channels_ == 3)
        cv::cvtColor(img, sample, cv::COLOR_BGRA2BGR);
    else if (img.channels() == 1 && num_channels_ == 3)
        cv::cvtColor(img, sample, cv::COLOR_GRAY2BGR);
    else
        sample = img;

    //resize image according to the input
    cv::Mat sample_resized;
    Size size(input_geometry_.width,input_geometry_.height );

    if (sample.size() != input_geometry_)
        cv::resize(sample, sample_resized, size);
    else
        sample_resized = sample;

    //...
}
这显然会导致访问冲突

这里出了什么问题,我该怎么办

更新:
更多信息:
sample.size()
sample.size()
num\u channels\u
是3个
img.channels()

当我使用
imshow()
显示img或sample时,会发出访问冲突异常。不过,创建一个简单的黑色图像并将其显示在imshow()中很好

感谢@Mika在评论中的建议,我发现原因首先是由于发送到
预处理
方法的图像,而不是
调整大小
方法本身。
进一步的调试证实了@Mika对
C
端错误代码的怀疑。 我最初是在
C#
侧写的:

[DllImport(@"CDll2.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
static extern void Classify_image(byte[] img, uint height, uint width, byte[] out_result, out int out_result_length, int top_n_results = 2);

private string Classify(Bitmap img, int top_n_results)
{
    byte[] result = new byte[200];
    int len;
    var img_byte = (byte[])(new ImageConverter()).ConvertTo(img, typeof(byte[]));

    Classify_image(img_byte, (uint)img.Height, (uint)img.Width,res, out len, top_n_results);

    return  ASCIIEncoding.ASCII.GetString(result);
}
这是
dll
部分的代码:

CDLL2_API void Classify_image(unsigned char* img_pointer, unsigned int height, unsigned int width, char* out_result, int* length_of_out_result, int top_n_results)
    {
        auto classifier = reinterpret_cast<Classifier*>(GetHandle());
        cv::Mat img = cv::Mat(height, width, CV_32FC3, (void*)img_pointer);

        std::vector<Prediction> result = classifier->Classify(img, top_n_results);

        //misc code...
        *length_of_out_result = ss.str().length();
    }

和DLL中的C++代码:< /P>

CDLL2_API void Classify_Image(unsigned char* img_pointer, unsigned int height, unsigned int width, int step, char* out_result, int* length_of_out_result, int top_n_results)
    {
        auto classifier = reinterpret_cast<Classifier*>(GetHandle());

        cv::Mat img = cv::Mat(height, width, CV_8UC3, (void*)img_pointer, step);

        std::vector<Prediction> result = classifier->Classify(img, top_n_results);

        //...
        *length_of_out_result = ss.str().length();
    }
CDLL2\u API void Classify\u图像(无符号字符*img\u指针、无符号整数高度、无符号整数宽度、整数步长、字符*输出结果、输出结果的整数*长度、顶部结果)
{
自动分类器=重新解释强制转换(GetHandle());
cv::Mat img=cv::Mat(高度、宽度、cv_8UC3,(空隙*)img_指针、步长);
std::vector result=分类器->分类(img,顶部结果);
//...
*结果的长度=ss.str().length();
}

这样做纠正了我之前遇到的所有访问违规行为

您是否检查了
input\u geometry\u.width
input\u geometry\u.height
的值?还有
sample.size()
?的值是多少?还有关于
if(sample.size()!=input\u geometry\uuu)
:什么样的对象是
input\u geometry\uu
?@fedepad:input\u geometry\uu的类型是
cv::size()
,就像
size
变量一样。起初我认为可能是因为输入的几何关系,然后我使用了一个新变量,得到了同样的异常。输入大小为彩色图像的
382x256
。高度和宽度分别为
224x224
。你为什么要创建两个问题来突出同一个问题?@mika:看看我的答案,你最初的猜测是对的。我在C#端走了一条不同的道路,一切都开始运转起来。然而,我真的很想知道为什么我最初的方法失败了!非常感谢您的时间和帮助。我真的很感激
//Dll import 
[DllImport(@"CDll2.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
static extern void Classify_Image(IntPtr img, uint height, uint width, int step, byte[] out_result, out int out_result_length, int top_n_results = 2);

//...
//main code 

Bitmap img = new Bitmap(txtImagePath.Text);
BitmapData bmpData = img.LockBits(new Rectangle(0, 0, img.Width, img.Height),  ImageLockMode.ReadWrite,  img.PixelFormat);
result = Classify_Image(bmpData.Scan0, (uint)bmpData.Height, (uint)bmpData.Width, bmpData.Stride, res, out len, top_n_results);
img.UnlockBits(bmpData); //Remember to unlock!!!
CDLL2_API void Classify_Image(unsigned char* img_pointer, unsigned int height, unsigned int width, int step, char* out_result, int* length_of_out_result, int top_n_results)
    {
        auto classifier = reinterpret_cast<Classifier*>(GetHandle());

        cv::Mat img = cv::Mat(height, width, CV_8UC3, (void*)img_pointer, step);

        std::vector<Prediction> result = classifier->Classify(img, top_n_results);

        //...
        *length_of_out_result = ss.str().length();
    }