Prosíme přihlašte se nebo zaregistrujte.

Přihlašte se svým uživatelským jménem a heslem.
Vaše pomoc je stále potřeba!

Autor Téma: C++ kompilace: "not declared in this scope" [vyřešeno]  (Přečteno 2677 krát)

Irteam

  • Návštěvník
  • Příspěvků: 3
C++ kompilace: "not declared in this scope" [vyřešeno]
« kdy: 08 Října 2011, 17:52:09 »
Zdravím Vás,
chtěl bych poradit ohledně kompilace na nové verzi UBUNTU. Mám zdrojový kód, který je bez chyby přeložitelný na serveru na kterem běží unix.
Po instalaci OpenCV a g++ mi bohuzel nejde prelozit z důvodu chyby:
Getchar was not declared in this scope.

Ano samozrejme bych jej mohl odstranit atd. Ale spis se chci zeptat proc mi to nejde z toho duvodu prelozit. Neni nejaka specialni konfigurace g++ nebo gcc. Setkal se s tím již někdo?

ukazka makefilu:

Kód: [Vybrat]
CC=g++
CFLAGS=-lm `pkg-config --cflags --libs opencv`
LOGIN=neco

all:hw1

hw1: hw1.cpp
${CC} ${CFLAGS} -o hw1 hw1.cpp

clean:
rm -f hw1 ${LOGIN}.tar.gz
zip:
tar -pczf ${LOGIN}.tar.gz *
« Poslední změna: 08 Října 2011, 18:56:42 od daysleeper »

Pavel Půlpán

Re:C++ kompilace
« Odpověď #1 kdy: 08 Října 2011, 18:02:01 »
Z makefile se v tomto případě nedozvíš nic... ukaž sem inkriminovaný kód.

Nicméně mrkni semka, mohlo by ti to pomoct: http://www.cplusplus.com/forum/general/37970/

Irteam

  • Návštěvník
  • Příspěvků: 3
Re:C++ kompilace
« Odpověď #2 kdy: 08 Října 2011, 18:15:39 »
ok, kdyz to pomuze. Ale v kodu chyba neni, na jinem systemu je bezproblemu prelozitelny.

Kód: [Vybrat]
#define VISUAL_OUTPUT 0

#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/features2d/features2d.hpp>
#include <iostream>
#include <sstream>

using namespace std;
using namespace cv;

void fillCheckerboard( Mat img);
Mat lazyConvertToGray(Mat img);
Mat  customNonlinearFilter( Mat img, const float angle);
Mat  convertToGray( Mat img);
char changeColor(char color);

int main( int argc, char* argv[])
{
string inputImageName;
string inputVideoName;
string outputDirectory;
uint64 randSeed = 0;

// zpracovani parametru prikazove radky
for( int i = 1; i < argc; i++){
if( string(argv[ i]) == "-ii" && i + 1 < argc){
inputImageName = argv[ ++i];
} else if( string(argv[ i]) == "-iv" && i + 1 < argc){
inputVideoName = argv[ ++i];
} else if( string(argv[ i]) == "-od" && i + 1 < argc){
outputDirectory = argv[ ++i];
} else if( string(argv[ i]) == "-s" && i + 1 < argc){
stringstream str( argv[ i]);
str >> randSeed;
} else if( string(argv[ i]) == "-h"){
cout << "Use: " << argv[0] << "  -ii inputImageName -iv inputVideoName [-od outputDirectory -s randSeed]" << endl;
return 0;
} else {
cerr << "Error: Unrecognized command line parameter \"" << argv[ i] << "\" use -h to get more information." << endl;
}
}

if( inputImageName.empty() || inputVideoName.empty()){
cerr << "Error: Some mandatory command line options were not specified." << endl;
return -1;
}

RNG rndGen( randSeed);



Mat inputImage;
inputImage = imread(inputImageName, CV_LOAD_IMAGE_COLOR);


if( inputImage.data == NULL) {
cerr <<  "Error: Failed to read image file \"" << inputImageName << "\"." << endl;
getchar();
return -1;
}


if( (inputImage.channels() != 1 && inputImage.channels() != 3) || inputImage.depth() != CV_8U){
cerr << "Error: Input image has wrong format." << endl;
getchar();
return -1;
}

if( (inputImage.cols < 300) || (inputImage.rows < 250)){
cerr << "Error: Input image is too smal." << endl;
getchar();
return -1;
}


Mat grayImage = lazyConvertToGray(inputImage);


Mat roiImage (grayImage, Rect(
100,
25,
50,
150));

fillCheckerboard(roiImage);

Mat checkerboardCopy;
checkerboardCopy = roiImage.clone();
Size velikost(11,11);
GaussianBlur(grayImage, grayImage, velikost, 2, 2, BORDER_DEFAULT);
imwrite( outputDirectory + "checkerboard.jpg", checkerboardCopy);
if( VISUAL_OUTPUT){
imshow( "Checkerboard", checkerboardCopy);
waitKey();
}

Mat resizedImage;
Size size(200,200);
resize(grayImage, resizedImage, Size(200,200), 0, 0, INTER_NEAREST);
for( int i = 0; i <= 9; i++){

Mat filteredImage = customNonlinearFilter( resizedImage, 2 * 3.14 / 10 * i);

Mat outImage;
normalize(filteredImage, outImage, 0, 255, NORM_INF ,CV_8U);

stringstream str("");
str << "Filtered_" << i;
string name = outputDirectory + str.str() + ".jpg";
cout<<name<<endl;
imwrite( name, outImage);


if( VISUAL_OUTPUT){
stringstream str;
str << "Filtered_" << i;
imshow( str.str(), outImage);
}
}


// Otevreni videa
VideoCapture capture( inputVideoName);

if( !capture.isOpened()){
cerr << "Error: Unable to open input video file \"" << inputVideoName << "\"." << endl;
        return -1;
}


cout << "Video " << inputVideoName << "\twidth " << capture.get(CV_CAP_PROP_FRAME_WIDTH) << "\theight " << capture.get(CV_CAP_PROP_FRAME_HEIGHT) << "\tFPS " << capture.get(CV_CAP_PROP_FPS) << "\tframe_count " << capture.get(CV_CAP_PROP_FRAME_COUNT) << endl;


const string outputVideoName = outputDirectory + "videoOut.avi";
Size sizeFrame(capture.get(CV_CAP_PROP_FRAME_WIDTH), capture.get(CV_CAP_PROP_FRAME_HEIGHT));
VideoWriter writer(outputVideoName, capture.get(CV_CAP_PROP_FOURCC), capture.get(CV_CAP_PROP_FPS), sizeFrame, true);

  if( !writer.isOpened()){
cerr << "Error: Unable to open output video file \"" << outputVideoName << "\"." << endl;
    return -1;
}


bool finished = false;
while( !finished){

Mat frame;
bool success = false;
capture >> frame;
    if(!frame.empty()){
      success = true;
    }

  finished |= !success;

if( success){


StarFeatureDetector detector( 32);
vector<KeyPoint> keypoints;
Mat grayFrame = lazyConvertToGray(frame);
      detector.detect( frame, keypoints);
for( int i = 0; i < (int) keypoints.size(); i++){
circle(frame, keypoints[i].pt, (int) keypoints[i].size, Scalar(255), 1, 8, 0);
}

writer.write(frame);

if( VISUAL_OUTPUT){

imshow( "Local features", frame);

switch( waitKey( 2)){
case 'x':
case 'X':
case 'q':
case 'Q':
finished = true;
break;
}
}
}
}



Mat A(100000, 4, CV_64F);

rndGen.fill( A, RNG::NORMAL, Scalar( 0), Scalar( 1));


Mat covM = (A.t()*A)/A.rows;


cout << covM;
}

Mat lazyConvertToGray(Mat img){
Mat grayImg;
if( img.channels() == 1){
img.copyTo(grayImg);
} else {
cvtColor(img, grayImg, CV_BGR2GRAY);
}
return grayImg;
}
char changeColor(char color){
if(color == (char)255){
color = 0;
}else{
color = 255;
}
return color;
}

void fillCheckerboard( Mat img)
{
if((img.cols % 3 != 0) || (img.rows % 6 != 0)){
cerr << "Sachovnice nebude uplna!"<< endl;
}
char color = 255;
int count = 1;
bool black = true;
for(int x = 0; x < img.cols; x++){
for(int y = 0; y < img.rows; y++){
if((y % 6) == 0){
color = changeColor(color);
}
img.at<char>(y,x)= color;
}
color = 255;
if(black == false){
color = changeColor(color);
}
count++;
if(count%3 == 0){
if(black == true)
black = false;
else
black = true;
}
}
}


Mat  customNonlinearFilter( Mat img, float angle)
{


const float e = 50;
float horKernelPtr[3] = {-0.5, 0, 0.5};
Mat horKernel( 1, 3, CV_32F, horKernelPtr);
Mat verKernel = horKernel.t(); // transpozice

Mat I_dx, I_dy;
filter2D(img, I_dx, CV_32F, horKernel, Point(-1,-1), 0, BORDER_DEFAULT );
filter2D(img, I_dy, CV_32F, verKernel, Point(-1,-1), 0, BORDER_DEFAULT );
Mat I_m, I_o;

cartToPolar(I_dx, I_dy, I_m, I_o);

Mat ADiff(I_o);
float diff;
for(int x = 0; x < ADiff.cols; x++){
for(int y = 0; y < ADiff.rows; y++){
diff = I_o.at<float>(x,y) - angle;
if( diff < -3.14){
diff = 2 * 3.14 + diff;
} else if( diff > 3.14){
diff = 2 * 3.14 - diff;
}
ADiff.at<float>(x,y)=abs(diff);
}
}

ADiff = -2 * ADiff;

Mat EADiff;
exp( ADiff, EADiff);


Mat I_mG;
 
  GaussianBlur(EADiff, I_mG, Size(19,19), 6, 0, BORDER_DEFAULT);


Mat result = (I_m.mul(EADiff))/(I_mG + e);

return result;
}


Šuohob

  • Závislák
  • ***
  • Příspěvků: 2171
Re:C++ kompilace
« Odpověď #3 kdy: 08 Října 2011, 18:32:27 »
prijde mi, ze pro funkci getchar nemas includovanou knihovnu. zkousels
Kód: [Vybrat]
#include <cstdio>
?
Tak dlouho se vrzá s Acerem, až se displej utrhne.

Irteam

  • Návštěvník
  • Příspěvků: 3
Re:C++ kompilace
« Odpověď #4 kdy: 08 Října 2011, 18:43:13 »
Ne nezkousel, a pomohlo to. Ale docela by mě zajímalo proč na jiných systémech při použití jak g++ nebo gcc jde bez problemu prelozit i bez pouziti teto knihovny? Neni to nahodou jenom o nastaveni prekladucu, nebo makefilu.

Ale i tak pripadne diky.

Martin Šácha

  • Člen občanského sdružení Ubuntu ČR a placené komunitní podpory
  • Administrátor fóra
  • ******
  • Příspěvků: 5153
Re:C++ kompilace: "not declared in this scope" [vyřešeno]
« Odpověď #5 kdy: 08 Října 2011, 21:10:40 »
To, že různé kompilátory mají různé nastavení a vzájemné prolinkování knihoven (a i std knihovny mají platform-specific fce, příkladem budiž vztah stdio.h a conio.h), je fakt se kterým nikdo nic nenadělá. Většinou se to řeší příkazy preprocesoru #ifdef a #ifndef...

Nejčastější příklad:
Kód: [Vybrat]
#ifdef WIN32
#include <windows.h>
#endif
Mint MATE 64bit / DuckDuckGo.com
Programátoři považují WYSIWYG za špatné u kódu i u žen. Programátor chce "dostat to, co žádá“ – kód tajemný, neodpouštějící, nebezpečný.

 

Provoz zaštiťuje spolek OpenAlt.