C ++,OpenCV:Resize中的断言失败

时间:2014-02-05 15:49:53

标签: c++ opencv resize

作为一名C ++初学者,我目前面临的一个问题是我无法解决,即使代码非常简单。 我一直在互联网上搜索answers,但没有一个适用于我的问题。

我目前正在使用OpenCV 2.4.8在VS2013下使用C ++编写基本SVM。 我能够处理相同大小的图像,指定代码开头的固定高度和宽度。

现在,我正在尝试:打开不同大小的图像,将它们调整为一定的较小尺寸,并将之前的代码应用于现已调整大小的数据集。就这么简单。

这是我的代码的开头:

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/ml/ml.hpp>
#include <iostream>
#include <math.h>
#include <fstream>
#include <string>
#include <sstream>
#include <windows.h>

using namespace cv;
using namespace std;

int main(){

输入参数为:

int Nb_Data_Class_1 = 10;
int Nb_Data_Class_0 = 5;
int Height_Zone = 200;
int Width_Zone = 200;

所以我会将所有文件的大小调整为200x200格式。

string Path = "C:\\Users\\....";
string Format = ".jpg";

int Nb_Files = Nb_Data_Class_1 + Nb_Data_Class_0;
Mat TrainingMat(Nb_Files, Zone_Image, CV_32FC1);
Mat TrainingLabels(Nb_Files, 1, CV_32FC1);

对于标记为{1}的类的每个文件 - 它们都被命名为Tree01,Tree02等。 - 我打开并调整大小。

for (int i = 0; i < Nb_Data_Class_1; ++i)
{
    stringstream ss;
    ss << Path << "\\Tree0" << i + 1 << Format;
    Mat Image = cv::imread(ss.str(), 0);
    resize(Image, Image, Size(Width_Zone, Height_Zone));}

没有最后一行,事情就完美无缺。我有一个Mat数组,填充0-t0-255数字。现在,我收到以下错误:

OpenCV Error: Assertion failed <ssize.area<> >0> in cv::resize, 
    file C:\builds\2-4-PackSlave-win32-vc12-shared\opencv\modules\imgproc\serc\imgwarp.cpp, line 1824

可能是什么问题? 我想也许OpenCV没有正确打开文件;但是,在那种情况下,以前的一切都可以如何运作? 仍在疑惑。

任何帮助将不胜感激!提前谢谢。

3 个答案:

答案 0 :(得分:14)

调整大小的唯一原因是缺少Image。即使您检查了某些图像是否被正确读取,但这并不意味着它们都是 - 其中一些可能会丢失。从磁盘读取文件是程序非常常见的失败点,因为您永远无法确定读取是否成功。因此,每当您阅读图像时,您确实应该验证它不是空的:

if (Image.cols == 0) {
     cout << "Error reading file " << ss << endl;
     return -1;
}

答案 1 :(得分:3)

在这种情况下不会解决问题,但尝试使用签名类型Mat调整CV_8SC3的大小也会导致此断言。例如:

Mat wrong = Mat::zeros(4, 4, CV_8SC3); // <- Notice 'S'
Mat right = Mat::zeros(4, 4, CV_8UC3); // <- Notice 'U'

imshow("OK", right);
imshow("ASSERTS", wrong);

请注意,检查wrong.cols != 0不会阻止此操作崩溃。

答案 2 :(得分:0)

你的专栏:  ss&lt;&lt;路径&lt;&lt; “\ Tree0”&lt;&lt; i + 1&lt;&lt;格式;

将产生(其中i = 0):   “C:\用户\ .... \ Tree01.jpg”

解决方案

更改“string Path =”C:\ Users \ ....“;”到:   string Path =“C:\ Users”;

和   更改“ss&lt;&lt;路径&lt;&lt;”\ Tree0“&lt;&lt; i + 1&lt;&lt;格式;”到:   ss&lt;&lt;路径&lt;&lt; “Tree0”&lt;&lt; i + 1&lt;&lt;格式;