Подтвердить что ты не робот

С++, OpenCV: утверждение не выполнено в Resize

Как начинающий С++, я столкнулся с проблемой, которую я как-то не могу решить, даже если код довольно прост. Я искал answers по всему Интернету, но ни один из них не применим для моей проблемы.

В настоящее время я кодирую базовые SVM с помощью С++ под VS2013, используя OpenCV 2.4.8. Я смог работать с изображениями одинакового размера, указав фиксированную высоту, ширину в начале моего кода.

Теперь я пытаюсь: открывать изображения разных размеров, изменять их размер до определенного более низкого размера и применять предыдущий код к набору данных с измененным размером. Просто как это.

Здесь начало моего кода:

#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: утверждение не выполнено > 0 > в cv:: resize, файл C:\builds\2-4-PackSlave-win32-vc12-shared\opencv\modules\imgproc\serc\imgwarp.cpp, строка 1824

В чем может быть проблема? Я думал, что, возможно, OpenCV неправильно открыл файлы; но в таком случае, как все могло быть раньше? Все еще интересно.

Любая помощь будет очень признательна! Спасибо заранее.

4b9b3361

Ответ 1

Единственная причина для изменения размера - отсутствие изображения. Даже если вы проверили правильность чтения некоторых изображений, это не означает, что все они были - некоторые из них могут отсутствовать. Чтение файлов с диска является очень распространенной точкой отказа для программ, потому что вы никогда не можете быть уверены, что чтение было успешно или нет. В результате каждый раз, когда вы читаете изображение, вы действительно должны убедиться, что оно не пустое:

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

Ответ 2

Не будем решать проблему в этом случае, но это утверждение также может быть вызвано попыткой изменить размер 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 не помешает этому сбой.

Ответ 3

Ваша строка:  ss < Путь < "\ Tree0" < я + 1 < Формат;

будет производить (где я = 0):. "C:\Users \....\Tree01.jpg"

Решение

Изменить "string Path =" C:\Users \.... ";" строка: string Path = "C:\Users";

и change "ss < < Path <" \Tree0 "< я + 1 < < Format;" строка: ss < Путь < "Tree0" < я + 1 < Формат;