2013-10-12 1 views
1

Я ищу, чтобы создать цикл, в котором пользователю нужно ввести некоторые номера, чтобы перепродать изображение. Повторное масштабирование работает, если пользователь вводит то, что находится в пределах ограничений, но когда они вводят число, которое является большим, разрывается код.if-else loop not looping C++ opencv visualstudio

#include <opencv2\core\core.hpp> 
#include <opencv2\highgui\highgui.hpp> 
#include <opencv2\imgproc\imgproc.hpp> 
#include <iostream> 
#include <cstdlib> 
#include <cctype> 

using namespace std; 
using namespace cv; 

int main() 
{ 
float Sx = 0; 
float Sy = 0; 
float NewX; 
float NewY; 

Mat img, ScaledImg; 
img = imread("C:/Jakob/tower.jpg"); 

do 
{ 
    cout << "The current image size is: " << img.rows << "x" << img.cols << endl; 
    cout << "First enter the new width for the image: "; 
    cin >> NewX; 
    cout << "Seond enter the new height for the image: "; 
    cin >> NewY; 
    if ((NewX >= 1) && (NewX <= 2000)) 
     if ((NewY >=1) && (NewY <= 2000)) 
     { 
      Sx = (NewX/img.rows); 
      cout << "You entered " << NewX << " For Width" << endl; 
      Sy = (NewY/img.cols); 
      cout << "You entered " << NewY << " For Height" << endl; 
     } 
     else 
     { 
      cout << "The number you entered does not match the requirements " << endl; 
      cout << "Please start over " << endl; 
     } 

} 
while (NewX < 1 && NewX >= 2000 && NewY < 1 && NewY >= 2000); 

cout << "Sx = " << Sx << endl; 
cout << "Sy = " << Sy << endl; 

resize(img, ScaledImg, Size(img.cols*Sx,img.rows*Sy)); 
imwrite("C:/Jakob/ScaledImage.jpg", ScaledImg); 

cout << "Rows: " << ScaledImg.rows << " and Cols: " << ScaledImg.cols << endl; 

imshow("Original", img); 
imshow("Scaled Image", ScaledImg); 
/*system("PAUSE");*/ 
waitKey(0); 
return 0; 

}

Ошибка я получаю после выполнения этого кода является то, что Sx используется без инициализации. Это происходит только в том случае, если номер не находится в пределах 1-2000

+0

эй, у вас есть строки и перевалы неправильно. должен быть (NewX/img.cols); и (NewY/img.rows); – berak

+0

Ах да, я вижу, что сейчас: D Спасибо. – Jakob

ответ

1

вы должны инициализировать объявленные переменные, чтобы использовать их

так что вам нужно инициализировать переменную Sx и Sy, чтобы избежать этой ошибки

Заменить

float Sx; 
float Sy; 

с

float Sx=0; 
float Sy=0; 

у вас есть проблема с делами в то время как состояние

изменить его

while ((NewX < 1 || NewX >= 2000) && (NewY < 1 || NewY >= 2000)); 
+0

Попытался, когда Ашалинд предложил это. Просто создает новую проблему. Почему я должен объявить их? По моему мнению, они объявляются внутри оператора if. И переменные также работают, если пользователь вводит что-то между 1-2000. Тогда нет проблем. Проблема возникает только тогда, когда число находится за пределами этого диапазона. – Jakob

+0

это весь код, который у вас есть? –

+0

Я обновил сообщение со всем, что у меня есть прямо сейчас :) – Jakob

3

Действительно, поскольку по умолчанию переменные в C++ инициализируются мусором. ли что-то вроде:

float Sx = 0.0; 
float Sy = 0.0; 

Эта линия:

resize(img, ScaledImg, Size(img.cols*Sx,img.rows*Sy)); 

будет работать только если Sx и Sy не 0, конечно, так что вы должны инициализировать их к чему-то, что имеет смысл для вас, если другие параметры более 2000.

+0

К сожалению, это не сработало. Это дало мне новую ошибку с проблемой памяти. – Jakob

+1

Он действительно работал - он решил первую проблему. Теперь у вас есть еще один вопрос, который нам нужно знать словами в «новой ошибке» для решения – doctorlove

+0

Да, вам нужно описать, что вы делаете дальше с Sx и Sy, чтобы получить дополнительную помощь :) – Ashalynd