2013-04-23 4 views
1
void doCorrectIntensityVariation(Mat& image) 
{ 
    Mat kernel = getStructuringElement(MORPH_ELLIPSE, Size(19,19)); 
    Mat closed; 
    morphologyEx(image, closed, MORPH_CLOSE, kernel); 
    image.convertTo(image, CV_32F); // divide requires floating-point 
    divide(image, closed, image, 1, CV_32F); 
    normalize(image, image, 0, 255, NORM_MINMAX); 
    image.convertTo(image, CV_8UC1); // convert back to unsigned int 

} 

inline void correctIntensityVariation(IplImage *img) 
{ 
//Mat imgMat(img); copy the img 
Mat imgMat; 
imgMat = img; //no copy is done, imgMat is a header of img 
doCorrectIntensityVariation(imgMat); 
imshow("gamma corrected",imgMat); cvWaitKey(0); 
} 

Quand j'appelleOpenCV C++ pour la conversion de la fonction d'interface C

cvShowImage ("normal", n_im); cvWaitKey (0); 
correctIntensityVariation(n_im);//here n_im is IplImage* 
cvShowImage ("After processed", n_im); cvWaitKey (0); 
// here I require n_im for further processing 

que je voulais « Après traités » être identique à celle de « gamma corrigé », mais ce que j'ai trouvé « Après traité » n'a pas été le même que celui de "gamma corrigé" mais identique à celui de "normal". Pourquoi?? Qu'est-ce qui ne va pas ??

Répondre

2

Un emballage très simple devrait faire le travail

Cheetsheet of openCV

J'utilise rarement le vieux api, parce que Mat sont beaucoup plus faciles à traiter et ils n'ont pas de performance lors de comparer avec la vieux c api.Like la OpenCV page tutoriel dire l'inconvénient principal de l'interface C de est que de nombreux systèmes de développement intégrés au support moment que C. par conséquent, à moins que vous ciblez des plateformes embarquées, il n'y a pas de point d'utiliser les anciennes méthodes (sauf si vous êtes un programmeur masochiste et que vous demandez des problèmes).

openCV tutorial

cv :: Mat LIT.

Ipl à cv :: Mat et Mat LIT.

IplImage* pImg = cvLoadImage(“lena.jpg”); 
cv::Mat img(pImg,0); //transform Ipl to Mat, 0 means do not copy 
IplImage qImg; //not pointer, it is impossible to overload the operator of raw pointer 
qImg = IplImage(img); //transform Mat to Ipl 

Edit: Je l'ai fait une erreur plus tôt, si le tapis serait réaffecté dans la fonction, vous avez besoin de pour copier ou essayer de voler la ressource (je ne sais pas comment le faire encore) à partir du Mat.

Copiez les données

void doCorrectIntensityVariation(cv::Mat& image) 
{ 
    cv::Mat kernel = cv::getStructuringElement(cv::MORPH_ELLIPSE, cv::Size(19,19)); 
    cv::Mat closed; 
    cv::morphologyEx(image, closed, cv::MORPH_CLOSE, kernel); 
    image.convertTo(image, CV_32F); // divide requires floating-point 
    cv::divide(image, closed, image, 1, CV_32F); 
    cv::normalize(image, image, 0, 255, cv::NORM_MINMAX); 
    image.convertTo(image, CV_8UC1); // convert back to unsigned int 

} 

//don't need to change the name of the function, the compiler treat 
//these as different function in c++ 
void doCorrectIntensityVariation(IplImage **img) 
{ 
    cv::Mat imgMat; 
    imgMat = *img; //no copy is done, imgMat is a header of img 
    doCorrectIntensityVariation(imgMat); 

    IplImage* old = *img; 
    IplImage src = imgMat; 
    *img = cvCloneImage(&src); 
    cvReleaseImage(&old); 
} 

int main() 
{ 


    std::string const name = "onebit_31.png"; 
    cv::Mat mat = cv::imread(name); 
    if(mat.data){ 
     doCorrectIntensityVariation(mat); 

     cv::imshow("gamma corrected mat",mat); 
     cv::waitKey(); 
    } 

    IplImage* templat = cvLoadImage(name.c_str(), 1); 
    if(templat){ 
     doCorrectIntensityVariation(&templat); 
     cvShowImage("mainWin", templat); 

     // wait for a key 
     cvWaitKey(0); 
     cvReleaseImage(&templat); 
    } 



    return 0; 
} 

vous pourriez écrire une petite fonction pour alléger les tâches

void copy_mat_Ipl(cv::Mat const &src, IplImage **dst) 
{ 
     IplImage* old = *dst; 
     IplImage temp_src = src; 
     *dst = cvCloneImage(&temp_src); 
     cvReleaseImage(&old); 
} 

et l'appeler dans la fonction

void doCorrectIntensityVariation(IplImage **img) 
{ 
    cv::Mat imgMat; 
    imgMat = *img; //no copy is done, imgMat is a header of img 
    doCorrectIntensityVariation(imgMat);  
    copy_mat_to_Ipl(imgMat, img); 
} 

Je signalerai comment " voler "la ressource de Mat plutôt que de la copier après Je trouve une solution solide.A Personne ne sait comment le faire?

+0

En fait, je veux que l'IplImage * soit produit, est-ce possible? Comme toute ma source nécessite IplImage * en entrée plutôt que Mat et renvoie IplImage * en sortie en dehors de doCorrectIntensityVariation. –

+0

Impossible d'utiliser img = imgMat; return img; en ligne IplImage * doCorrectIntensityVariation (IplImage * img). Il est impossible de convertir 'cv :: Mat' en 'IplImage * {aka _IplImage *}' dans l'affectation –

+0

Après la ligne imgMat = img; Le imgMat agit comme un alias de img, en d'autres termes, tout ce qui s'applique sur imgMat s'appliquerait aussi sur img. Vous pouvez passer votre IplImage * (dans ce cas, c'est img) dans le wrapper, ce sera la sortie que vous demandez . Je modifie ma réponse, vous pouvez le vérifier à nouveau – StereoMatching