推薦軟硬體、網站

Google Adsense

aNobii網路書櫃

顯示具有 Computer Vision 標籤的文章。 顯示所有文章
顯示具有 Computer Vision 標籤的文章。 顯示所有文章

2011年1月4日 星期二

[Project] Personalized Photo Ranking System -- Web Version



A simplified Web version of "Personalized Photo Ranking and Selection System".

http://cml18.csie.ntu.edu.tw/~ryanlei/photo_ranking

Authors: 雷禹恆 (Ryan Lei, r99944007), 曾開瑜 (Kai-Yu Tseng, r99944001), MiRA GroupCMLabNTU.

2010年1月10日 星期日

OpenCV: How to print (dump) Matrix (Image) contents with specified range

After grabbing ideas from Random Noise blog, I created my own printMat() functions

The first works for single-channel 2D matrices of type CvMat.
Better yet, it has default arguments (rowBeg, rowEnd, colBeg, colEnd) for you to specify the range.
If none is specified, the function prints the entire matrix.

The second is just the overloaded version for the type IplImage, so this function can print both a matrix and an image depending on argument 1.


Function prototypes:
void printMat(CvMat *matrix, const char *name, int rowBeg = -1, int rowEnd = -1, int colBeg = -1, int colEnd = -1);

void printMat(IplImage *img, const char *name, int rowBeg = -1, int rowEnd = -1, int colBeg = -1, int colEnd = -1);


Function implementations:
/* Print a single-channel 2D matrix, with default range being the whole matrix */
void printMat(CvMat *A, const char *name, int rowBeg, int rowEnd, int colBeg, int colEnd) {
/* If the (row, col) range is all in default => Use the full range */
if (rowBeg == -1 && rowEnd == -1 && colBeg == -1 && colEnd == -1) {
rowBeg = 0; rowEnd = A->rows - 1; colBeg = 0; colEnd = A->cols - 1;
}

/* Check for validity of the privided (row, col) range */
if (rowBeg < 0 || rowEnd >= A->rows || rowBeg > rowEnd || colBeg < 0 || colEnd >= A->cols || colBeg > colEnd) {
error("printMat(): Invalid range of (rowBeg, rowEnd, colBeg, colEnd)." );
}

cout << endl << name << "(" << rowBeg << ":" << rowEnd << ", " << colBeg << ":" << colEnd << ") =\n\n";
for (int i = rowBeg; i <= rowEnd; i++) {
switch (CV_MAT_DEPTH(A->type)) {
case CV_32F:
case CV_64F:
for (int j = colBeg; j <= colEnd; j++)
/* Use C's printf() for convenience :p */
printf("%7.3f ", (float)cvGetReal2D(A, i, j));
break;
case CV_8U:
case CV_8S:
case CV_16U:
case CV_16S:
case CV_32S:
for (int j = colBeg; j <= colEnd; j++)
/* Use C's printf() for convenience :p */
printf("%4d ", (int)cvGetReal2D(A, i, j));
break;
default:
cerr << "printMat(): Matrix type not supported.\n";
exit(EXIT_FAILURE);
break;
}
cout << endl;
}
cout << endl;
}





/* Print a single-channel image, with default range being the whole matrix */
/* This is the overloaded version for IplImage */
void printMat(IplImage *A, const char *name, int rowBeg, int rowEnd, int colBeg, int colEnd) {
/* If the (row, col) range is all in default => Use the full range */
if (rowBeg == -1 && rowEnd == -1 && colBeg == -1 && colEnd == -1) {
rowBeg = 0; rowEnd = A->height - 1; colBeg = 0; colEnd = A->width - 1;
}

/* Check for validity of the privided (row, col) range */
if (rowBeg < 0 || rowEnd >= A->height || rowBeg > rowEnd || colBeg < 0 || colEnd >= A->width || colBeg > colEnd) {
error("printMat(): Invalid range of (rowBeg, rowEnd, colBeg, colEnd)." );
}

cout << endl << name << "(" << rowBeg << ":" << rowEnd << ", " << colBeg << ":" << colEnd << ") =\n\n";
for (int i = rowBeg; i <= rowEnd; i++) {
switch (A->depth) {
case IPL_DEPTH_32F:
case IPL_DEPTH_64F:
for (int j = colBeg; j <= colEnd; j++)
/* Use C's printf() for convenience :p */
printf("%7.3f ", (float)cvGetReal2D(A, i, j));
break;
case IPL_DEPTH_8U:
case IPL_DEPTH_8S:
case IPL_DEPTH_16U:
case IPL_DEPTH_16S:
case IPL_DEPTH_32S:
for (int j = colBeg; j <= colEnd; j++)
/* Use C's printf() for convenience :p */
printf("%4d ", (int)cvGetReal2D(A, i, j));
break;
case IPL_DEPTH_1U:
for (int j = colBeg; j <= colEnd; j++)
/* Use C's printf() for convenience :p */
printf("%1d ", (int)cvGetReal2D(A, i, j));
break;
default:
cerr << "printMat(): Matrix type not supported.\n";
exit(EXIT_FAILURE);
break;
}
cout << endl;
}
cout << endl;
}


Powered By Blogger

Google Analytics