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?
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. –
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 –
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