2014-04-11 3 views
0

내 얼굴 인식 프로젝트에 mysql 데이터베이스를 사용하고 있습니다. 여기 테이블에 이미지를 저장하고 이미지를 BLOB 이미지로 저장합니다.이 이미지를 다시 선택하면이 BLOB 이미지를 다음과 같이 작성해야합니다. 파일 포인터를 사용하여 이미지 파일을 분리하면 프로그램이 상주하는 폴더에 저장됩니다. 그리고 해당 이미지를 사용하려면 해당 폴더에서 다시 읽어야합니다. 그 이미지 만 다른 기능으로 사용할 수 있습니다. 하지만 데이터베이스에서 직접 BLOB 이미지를 사용해야합니다 (DB에서 선택하면 다른 기능으로 전달해야합니다). 그래서 내가 폴더에서 다시 그것을 읽는 것과 같은 작업을 줄일 수 있습니다. 어떻게 bl을 변환 할 수 있습니다. 그래서 다른 기능에 직접 DB 이미지를 전달하기 때문에, 나는 우리가 그것의 유형이나 뭔가를 변환해야한다고 생각. 귀하의 이미지의 픽셀 데이터와 같은 일부 이미지 포맷 (JPEG, PNG, BMP, ...) 및하지를 사용하여 저장하는 경우blob 이미지를 매트 이미지로 변환

void SelectImage() 
{ 
MYSQL *conn; 
MYSQL_RES *result; 
MYSQL_ROW row; 
char temp[900]; 
char filename[50]; 
unsigned long *lengths; 
FILE *fp; 
my_ulonglong numRows; 
unsigned int numFields; 
int mysqlStatus = 0; 
MYSQL_RES *mysqlResult = NULL; 
conn = mysql_init(NULL); 
mysql_real_connect(conn, "localhost", "root", "[email protected]", "Athira", 0, NULL, 0); 
int state=mysql_query(conn, "SELECT * FROM ima1"); 
mysqlResult=mysql_store_result(conn); 
if(mysqlResult) 
{ 
    numRows=mysql_num_rows(mysqlResult); 

} 
cout<<"rows:"<<numRows<<endl; 
for(int i=1;i<=numRows;i++){ 
    sprintf(temp,"SELECT data FROM ima1 WHERE id=%d",i); 
    sprintf(filename,"Gen_Image%d.jpeg",i); 
    fp = fopen(filename, "wb");// open a file for writing. 
    cout<<temp<<" to "<<filename<<endl; 
    mysql_query(conn, temp);//select an image with id 
    result = mysql_store_result(conn); 
    row = mysql_fetch_row(result);//row contains row data 
    lengths = mysql_fetch_lengths(result);//this is the length of th image 
    fwrite(row[0], lengths[0], 1, fp);//writing image to a file 
    cout<<"selected..."<<endl; 
    img.create(100,100,CV_16UC1); 
    memcpy(img.data,row.data,lengths); 
    mysql_free_result(result); 
    fclose(fp); 
} 

    mysql_close(conn); 
    } 

I tried to convert it to Mat type but it's showing error.. 
error is this, 
error: request for member ‘data’ in ‘row’, which is of non-class type ‘MYSQL_ROW {aka char**}’ 
+1

사이드 노트 : 이미지 행당 하나의 쿼리를 수행하는 이유는 무엇입니까? 첫 번째'SELECT * from ima1' 쿼리 만 있으면됩니다. –

답변

0

, 당신은 OpenCV의에서 imdecode 기능을보고해야한다.

데이터가 원시 픽셀로 저장되어있는 경우 OpenCV에서 행렬을 레이아웃하는 데 사용하는 단계/단계 기능을 사용하여 BLOB 데이터의 메모리 레이아웃을 표현할 수 있어야합니다.

+0

예를 보여 주실 수 있습니까? – user3228547

+0

예를 들면? 'imdecode'의 경우 버퍼와 일부 플래그에 대한 포인터를 전달하기 만하면됩니다. 원시 픽셀의 경우,'cv :: Mat'의 데이터가 어떻게 레이아웃되는지 조사해야합니다. –

+0

나는 그것을 이렇게 준 : 매트 imgg = cvDecodeImageM (행, CV_LOAD_IMAGE_COLOR), 다시 오류를 보여줍니다 : 오류 : 'CVMMat'에 '1'에 대한 'const CvMat *' 'MYSQL_ROW {일명 char **}'변환 할 수 없습니다 : cvDecodeImageM (const CvMat *, int) ' – user3228547

관련 문제