apache下隐藏文件

apache的工作根目下如果没有index.html (php,htm)等文件的话,浏览器就会把目录下的文件都显示出来,不利于隐私文件的隐藏,可以在apache的配置文件里面加入

IndexIgnore mymusic/*

IndexIgnore mydoc/*

就可以了,上例是隐藏mymusic和mydoc目录下所有文件,也可以指定某个文件,支持通配符

原创:Archlinux和Freebsd8.2下流媒体服务网页Ampache的安装、配置简介

本文参考了ArchWiki中ampache的相关章节,并结合了我的一些Freebsd8.2下的安装经验。

ampache是一个基于php的网页系统,可以用来建立自己的音乐流媒体服务器,功能还是很多的。在安装ampache前需要先安装apache,mysql,php以及php的扩展(需要注意的是php的扩展最好都安装并加载,不然容易出问题,我在freebsd8.2下就出现了没有加载xml,xmlreader,xmlwriter等几个扩展出现了php关于sh256的一个错误)。建议在玩ampache之前先要略懂apache,mysql,和php的相关配置,不然不容易玩转。
apache是web服务软件,php(以及其扩展)是php网页正常显示所需要的,别忘了ampache是用php写的,mysql数据库是ampache进行歌曲录入、查找等功能所需要的。
archlinux下要注意mysql的启动问题,手动启动mysql的方法可以参考我以前的博客文章,如果觉得麻烦可以开机启动,在/etc/rc.conf中的DAEMONS=()中加入mysqld就可以开机启动mysql,不过会造成开机慢几秒,加入httpd会开机启动apache。

archlinux下用yaourt或pacman安装ampache,其实就是把ampache下载了下来,freebsd下到ports里make install clean,就ok了,记得看安装完后的信息里面有ampache的安装目录,下面用得着。

将ampache目录下的文件放在apache服务配置文件指定的根目录下(如果你的服务器只挂ampache这一个网页的话可以这么做),例如freebsd8.2下通常是/usr/local/www/apache22/,archlinux下是/srv/http/。我的apache挂了很多网页,所以我在apache根目录下开了新目录,用了vitual host的方法把个二级域名映射到这个目录了。
弄好后,重启apache,浏览器输入http://localhost(如果你的apache用127.0.0.1:80开启服务的话,否则用你电脑的ip或者域名代替localhost)。这时,如果一切配置正确的话,会出现ampache的配置页面,
webpath设置为“/”如果你的apache根目录下放着ampache的所有文件的话,如果ampache的文件放在根目录下的music文件夹下,那么就是“/music”了
database usernane 是root(你的mysql管理员帐号)
然后就是输入些密码,为ampache创建mysql数据库,以及ampache管理员账户等的一些操作比较简单。
这写东西弄完后,就可以生成配置文件,将生成的配置文件下载,并放到ampache文件中config/目录下,重启apache,你就可以登陆ampache了,用管理员登陆,添加音乐目录和其他用户后,现在你的流媒体服务就开启了。

ANSI C中float类型的机器表示方法

Inter CPU有三种浮点类型,即短实数、长实数和80位临时实数,分别占用4字节、8字节和10字节,对应着C/C++中的float、double 和long double。


通常,Float 格式数据长32 bits,最高位为符号位:0为正,1为负;紧接着的8位为阶码:为了便于比较大小,其固定偏移7FH长,即0实际表示-7FH,7FH实际表示 0,0FFH实际表示80H;余下的低23位为尾数(有效数字),为了使有效数字达到最大精度,这23个有效数字隐含着固定位,比如尾数 10000000000000000000001其实就是1.10000000000000000000001,1被省略,而小数点固定在首位。
根据以上规则可以知道float所能表示的绝对值大小范围是
±1.00000000000000000000000B×2(0x00-0x7F) 到±1.11111111111111111111111B×2(0xFF-0x7F)
然而事实上并不是这样,因为从这个范围可以看出它并不能表示0.0,而0.0为常用数字,所以特别规定±1.00000000000000000000000B×200为零,规定指数为0xFF的数字为非法数字,因此float实际的绝对值范围(除去0以外)是
0 000,0000,0 000,0000,0000,0000,0000,0001 B 至
0 111,1111,0 111,1111,1111,1111,1111,1111 B
即 0 并上 ±1.00000000000000000000001B×2(0x00-0x7F) 到±1.11111111111111111111111B×2(0xFE-0x7F)

注意
0可以用+0表示,也可以用-0表示,±0虽然在存储器上格式不同,但比较值相同,然而如果是用字节来比较float类型大小时却需要注意这一点。

转载:Linux下使用libxml解析xml文件的例子

转载:Linux下使用libxml解析xml文件的例子

编译方法:
g++ test1.c -o test1 `xml2-config --libs --cflags`

#include <stdio.h>
#include <libxml/xmlreader.h>
#include <libxml/tree.h>

static void processNode(xmlTextReaderPtr reader)
{
const xmlChar *name, *value;
// name = xmlTextReaderConstName(reader);
//     if (name == NULL)
//name = BAD_CAST "--";
name = xmlTextReaderName(reader);
value = xmlTextReaderValue(reader);
if (name == NULL)
name = xmlStrdup(BAD_CAST "--");
/*
value = xmlTextReaderConstValue(reader);
if (value != NULL && strcmp(value, "\n") != 0)
printf("%s \"%s\"\n", name,value);

printf("%d %d %s %d",
xmlTextReaderDepth(reader),
xmlTextReaderNodeType(reader),
name,
xmlTextReaderIsEmptyElement(reader));

*/

// printf("%s ",name);
if(xmlTextReaderNodeType(reader)==1||xmlTextReaderNodeType(reader)==3)
{
if(strcmp(name,"#text")!=0)printf("%s ",name);
xmlFree(name);
if (value == NULL)
printf("\n");
else
{
printf("%s\n", value);
xmlFree(value);
}
}
}

streamFile(const char *filename)
{
xmlTextReaderPtr reader;
int ret;
reader = xmlReaderForFile(filename, "GB2312", 0);
if (reader != NULL) {
ret = xmlTextReaderRead(reader);
while(ret == 1) {
processNode(reader);
ret = xmlTextReaderRead(reader);
}
xmlFreeTextReader(reader);
if (ret != 0) {
perror("parse");
}
} else {
perror("open");
}
}

int main(int argc, char **argv)
{
if (argc < 2)
return;
streamFile(argv[1]);
xmlCleanupParser();
xmlMemoryDump();
return 0;
}

转载:Linux下一个使用http协议下载网页的例子

转载:一个使用http协议下载网页的例子

/******* http客户端程序 httpclient.c ************/
/*测试用例 a.out www.tootoogo.org */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <errno.h>
#include <unistd.h>
#include <netinet/in.h>
#include <limits.h>
#include <netdb.h>
#include <arpa/inet.h>
#include <ctype.h>

//////////////////////////////httpclient.c 开始///////////////////////////////////////////

/********************************************
功能:搜索字符串右边起的第一个匹配字符
********************************************/
char * Rstrchr(char * s, char x)  {

if(!(*s))  return 0;
int i = strlen(s);
while(s[i-1]) if(strchr(s + (i - 1), x))  return (s + (i - 1));  else i--;
return 0;
}

/********************************************
功能:把字符串转换为全小写
上述代码中的:while(*s) *s=tolower(*s++);
应该改为:wh
********************************************/
void ToLowerCase(char * s)  {

while(s && *s) {*s=tolower(*s);s++;}
}

/**************************************************************
功能:从字符串src中分析出网站地址和端口,并得到用户要下载的文件
***************************************************************/
void GetHost(char * src, char * web, char * file, int * port)  {
char * pA;
char * pB;
memset(web, 0, sizeof(web));
memset(file, 0, sizeof(file));
*port = 0;
if(!(*src))  return;
pA = src;
if(!strncmp(pA, "http://", strlen("http://")))  pA = src+strlen("http://");
else if(!strncmp(pA, "https://", strlen("https://")))  pA = src+strlen("https://");
pB = strchr(pA, '/');
if(pB)  {
memcpy(web, pA, strlen(pA) - strlen(pB));
if(pB+1)  {
memcpy(file, pB + 1, strlen(pB) - 1);
file[strlen(pB) - 1] = 0;
}
}
else  memcpy(web, pA, strlen(pA));
if(pB)  web[strlen(pA) - strlen(pB)] = 0;
else  web[strlen(pA)] = 0;
pA = strchr(web, ':');
if(pA)  *port = atoi(pA + 1);
else *port = 80;
}

int main(int argc, char *argv[])
{
int sockfd;
char buffer[1024];
struct sockaddr_in server_addr;
struct hostent *host;
int portnumber,nbytes;
char host_addr[256];
char host_file[1024];
char local_file[256];
FILE * fp;
char request[1024];
int send, totalsend;
int i;
char * pt;

if(argc!=2)
{
fprintf(stderr,"Usage:%s web-address\a\n",argv[0]);
exit(1);
}
printf("parameter.1 is: %s\n", argv[1]);
ToLowerCase(argv[1]);/*将参数转换为全小写*/
printf("lowercase parameter.1 is: %s\n", argv[1]);

GetHost(argv[1], host_addr, host_file, &portnumber);/*分析网址、端口、文件名等*/
printf("webhost:%s\n", host_addr);
printf("hostfile:%s\n", host_file);
printf("portnumber:%d\n\n", portnumber);

if((host=gethostbyname(host_addr))==NULL)/*取得主机IP地址*/
{
fprintf(stderr,"Gethostname error, %s\n", strerror(errno));
exit(1);
}

/* 客户程序开始建立 sockfd描述符 */
if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)/*建立SOCKET连接*/
{
fprintf(stderr,"Socket Error:%s\a\n",strerror(errno));
exit(1);
}

/* 客户程序填充服务端的资料 */
bzero(&server_addr,sizeof(server_addr));
server_addr.sin_family=AF_INET;
server_addr.sin_port=htons(portnumber);
server_addr.sin_addr=*((struct in_addr *)host->h_addr);

/* 客户程序发起连接请求 */
if(connect(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))==-1)/*连接网站*/
{
fprintf(stderr,"Connect Error:%s\a\n",strerror(errno));
exit(1);
}

sprintf(request, "GET /%s HTTP/1.1\r\nAccept: */*\r\nAccept-Language: zh-cn\r\n \
User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)\r\n    \
Host: %s:%d\r\nConnection: Close\r\n\r\n", host_file, host_addr, portnumber);

//  sprintf(request,"GET /googleservice/google.asmx/GetTxMsg?BDCard=301091&StartTime=2011-8-2-10:30&EndTime=2011-9-6-11:40 HTTP/1.1\r\nHost: www.ubinavi.com.cn\r\nConnection: Close\r\n\r\n");
printf("%s", request);/*准备request,将要发送给主机*/

/*取得真实的文件名*/
if(host_file && *host_file)  pt = Rstrchr(host_file, '/');
else pt = 0;

memset(local_file, 0, sizeof(local_file));
if(pt && *pt)  {
if((pt + 1) && *(pt+1))  strcpy(local_file, pt + 1);
else  memcpy(local_file, host_file, strlen(host_file) - 1);
}
else if(host_file && *host_file)  strcpy(local_file, host_file);
else  strcpy(local_file, "index.html");
///////////////////////////////////
//sprintf(local_file,"tmp.xml");
///////////////////////////////////
printf("local filename to write:%s\n\n", local_file);

/*发送http请求request*/
send = 0;totalsend = 0;
nbytes=strlen(request);
while(totalsend < nbytes) {
send = write(sockfd, request + totalsend, nbytes - totalsend);
if(send==-1)  {printf("send error!%s\n", strerror(errno));exit(0);}
totalsend+=send;
printf("%d bytes send OK!\n", totalsend);
}

fp = fopen(local_file, "w");
if(!fp)  {
printf("create file error! %s\n", strerror(errno));
return 0;
}
printf("\nThe following is the response header:\n");
i=0;
/* 连接成功了,接收http响应,response */

while((nbytes=read(sockfd,buffer,1))==1)
{
if(i < 4)  {
if(buffer[0] == '\r' || buffer[0] == '\n')  i++;
else i = 0;
printf("%c", buffer[0]);/*把http头信息打印在屏幕上*/
}
else  {
fwrite(buffer, 1, 1, fp);/*将http主体信息写入文件*/
i++;
if(i%1024 == 0)  fflush(fp);/*每1K时存盘一次*/
}
}
printf("recv %d\n",i);
fclose(fp);
/* 结束通讯 */
close(sockfd);
exit(0);
}
//////////////////////////////httpclient.c 结束///////////////////////////////////////////

搬家折腾了快两个月,今天服务器终于回复运行了,庆祝一下!

搬家折腾了快两个月,前天把服务器硬盘装上了,长城宽带也移过来了,在新家上电测服务器一切正常,庆祝一下!

转载:LibJpeg解码内存中的Jpeg数据

熟悉libjpeg的朋友都知道libjpeg是一个开源的库。Linux和Android都是用libjpeg来支持jpeg文件的,可见其功能多么强 大。但是默认情况下libjpeg只能处理jpeg文件的解码,或者把图像编码到jpeg文件。在嵌入式设备中没有文件系统也是很正常的事情,难道我们就 不能利用libjpeg的强大功能了吗?当然不是!本文将会介绍怎样扩展libjpeg让其能够解码内存中的jpeg数据。

在介绍主题之前,请允许我讨论一下公共代码库的数据输入的一些问题。因为一个公共代码库是开放给大家用的,这个世界的输入方式也是多种多样的,比如可以通 过文件输入,shell用户手工输入,内存缓存输入,网络socket输入等等。所以实现库的时候,千万不要假定用户只有一种输入方式。

通用的做法是实现一个输入的中间层。如果库是以支持面向对象语言实现的话,可以实现一套流机制,实现各式各样的流(文件流,缓存流,socket流等)。 公共代码库的输入为流对象。这样库就可以实现各式各样的输入了。一个例子请参考Android图形引擎Skia的实现。

假如库是用非面向对象的语言实现的话,那么怎样来实现多种输入方式呢?可以通过定义输入对象的数据结构,该数据结构中让用户注册读写数据的函数和数据。因 为只有调用者最清楚他的数据来源,数据读取方式。在公共代码库中,只需要调用用户注册的回调函数对数据进行读写就可以了。这样的话,也可以实现公共代码库 对多种输入方式的支持。

回到本文的主题,libjpeg对多种输入的支持就不好,它假设了用户只会用文件作为输入,没有考虑其他的输入方式。经过研究他的源代码发现其内部也是非 常容易扩展,进而实现对多种输入的支持的,但是libjpeg没有更这样做,不明白为什么。请看jpeglib.h中如下定义:

/* Data source object for decompression */
struct jpeg_source_mgr {
  const JOCTET * next_input_byte; /* => next byte to read from buffer */
  size_t bytes_in_buffer;	/* # of bytes remaining in buffer */

  JMETHOD(void, init_source, (j_decompress_ptr cinfo));
  JMETHOD(boolean, fill_input_buffer, (j_decompress_ptr cinfo));
  JMETHOD(void, skip_input_data, (j_decompress_ptr cinfo, long num_bytes));
  JMETHOD(boolean, resync_to_restart, (j_decompress_ptr cinfo, int desired));
  JMETHOD(void, term_source, (j_decompress_ptr cinfo));
};

可以看出source manager对象可以注册多个回调函数来对数据进行读写。在看jdatasrc.c中的代码:

typedef struct {
  struct jpeg_source_mgr pub;	/* public fields */

  FILE * infile;		/* source stream */
  JOCTET * buffer;		/* start of buffer */
  boolean start_of_file;	/* have we gotten any data yet? */
} my_source_mgr;

该文件为jpeglib的source manger初始化和管理的地方。上面的数据结构是内部使用的源数据。可以看出其源数据只支持文件输入(infile变量),并提供缓存功能(buffer变量)。

其对source manager初始化的接口定义子jpeglib.h中,定义如下:

EXTERN(void) jpeg_stdio_src JPP((j_decompress_ptr cinfo, FILE * infile));

通过这个接口我们可以看出它的source manager只能接收文件作为输入。该函数的实现在jdatasrc.c文件中。

为了支持内存jpeg数据输入,我的设计是在jdatasrc.c中实现一个新的接口来初始化jpeglib的source manger对象。并完成注册其读写的回调函数给source manager。

说干就干,首先我们需要让source manager对象支持内存数据。修改my_source_mgr数据结构如下:

typedef struct{
  UINT8* img_buffer;
  UINT32 buffer_size;
  UINT32 pos;
}BUFF_JPG;
/* Expanded data source object for stdio input */

typedef struct {
  struct jpeg_source_mgr pub;	/* public fields */
  union{
    BUFF_JPG jpg;		/* jpeg image buffer */
    VFS_FILE * infile;		/* source stream */
  };
  JOCTET * buffer;		/* start of buffer */
  boolean start_of_file;	/* have we gotten any data yet? */
} my_source_mgr;

可以看出我们通过union来支持内存数据(jpg变量)或者文件输入。因为需要负责读写必须要标识出当前内存读写的位置,所以必须要在BUFF_JPG数据结构中定义pos变量。

下一步我们需要实现读写内存jpeg数据的回调函数了。经过分析对文件数据读写的回调函数,发现我们只需要实现jpeg_source_mgr数据结构中 的fill_input_buffer回调函数就可以了,其他的回调函数可以延用对文件读取的回调函数。在jdatasrc.c文件中,定义回调函数如 下:

/*
* This function will read the jpeg memery block to fill the library buffer.
*/
METHODDEF(boolean)
jpg_fill_input_buffer (j_decompress_ptr cinfo)
{
  my_src_ptr src = (my_src_ptr) cinfo->src;
  size_t nbytes;

  if(src->jpg.img_buffer == NULL || src->jpg.pos >= src->jpg.buffer_size){
    nbytes = -1;
  }
  else {
    nbytes = (src->jpg.pos + INPUT_BUF_SIZE > src->jpg.buffer_size ? 	\
   	src->jpg.buffer_size - src->jpg.pos : INPUT_BUF_SIZE);
    MEMCPY(src->buffer, src->jpg.img_buffer + src->jpg.pos, nbytes);
    src->jpg.pos += nbytes;
  }

  if (nbytes <= 0) {
    if (src->start_of_file)	/* Treat empty input file as fatal error */
      ERREXIT(cinfo, JERR_INPUT_EMPTY);
    WARNMS(cinfo, JWRN_JPEG_EOF);
    /* Insert a fake EOI marker */
    src->buffer[0] = (JOCTET) 0xFF;
    src->buffer[1] = (JOCTET) JPEG_EOI;
    nbytes = 2;
  }

  src->pub.next_input_byte = src->buffer;
  src->pub.bytes_in_buffer = nbytes;
  src->start_of_file = FALSE;

  return TRUE;
}

可以看出我们读取数据都是从内存缓存中读取,如果到达缓存末尾就返回-1。

经过调试分析还发现jdatasrc.c文件中skip_input_data函数有一个不严谨的地方。原来代码中如下:

METHODDEF(void)
skip_input_data (j_decompress_ptr cinfo, long num_bytes)
{
  my_src_ptr src = (my_src_ptr) cinfo->src;

  /* Just a dumb implementation for now.  Could use fseek() except
   * it doesn't work on pipes.  Not clear that being smart is worth
   * any trouble anyway --- large skips are infrequent.
   */
  if (num_bytes > 0) {
    while (num_bytes > (long) src->pub.bytes_in_buffer) {
      num_bytes -= (long) src->pub.bytes_in_buffer;
      (void) fill_input_buffer(cinfo);
      /* note we assume that fill_input_buffer will never return FALSE,
       * so suspension need not be handled.
       */
    }
    src->pub.next_input_byte += (size_t) num_bytes;
    src->pub.bytes_in_buffer -= (size_t) num_bytes;
  }
}

请注意显示地调用了fill_input_buffer,而不是调用注册给source manager的回调函数。这样做是不严谨的,虽然只支持文件输入的情况下,这样写没有任何问题,但是如果我们增加其他的输入方式的话(比如内存数据输 入),这样写将不会调用到我们注册给Source manager的fill_input_buffer回调函数。所以如上的代码修改为:

METHODDEF(void)
skip_input_data (j_decompress_ptr cinfo, long num_bytes)
{
  my_src_ptr src = (my_src_ptr) cinfo->src;

  /* Just a dumb implementation for now.  Could use fseek() except
   * it doesn't work on pipes.  Not clear that being smart is worth
   * any trouble anyway --- large skips are infrequent.
   */
  if (num_bytes > 0) {
    while (num_bytes > (long) src->pub.bytes_in_buffer) {
      num_bytes -= (long) src->pub.bytes_in_buffer;
      //(void) fill_input_buffer(cinfo);
      (void) src->pub.fill_input_buffer(cinfo);
      /* note we assume that fill_input_buffer will never return FALSE,
       * so suspension need not be handled.
       */
    }
    src->pub.next_input_byte += (size_t) num_bytes;
    src->pub.bytes_in_buffer -= (size_t) num_bytes;
  }
}

调用我们注册的回调函数来读取数据。

最好我们需要实现一个供用户用内存jpeg数据初始化source manager的接口。我的定义如下:

/*
* This function improve the library can use the jpeg memory block as source.
*/
GLOBAL(void)
jpeg_stdio_buffer_src (j_decompress_ptr cinfo, UINT8 * buffer, UINT32 size)
{
  my_src_ptr src;

  if (cinfo->src == NULL) {	/* first time for this JPEG object? */
    cinfo->src = (struct jpeg_source_mgr *)
      (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT,
				  SIZEOF(my_source_mgr));
    src = (my_src_ptr) cinfo->src;
    src->buffer = (JOCTET *)
      (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT,
				  INPUT_BUF_SIZE * SIZEOF(JOCTET));
  }

  src = (my_src_ptr) cinfo->src;
  src->pub.init_source = init_source;
  src->pub.fill_input_buffer = jpg_fill_input_buffer;
  src->pub.skip_input_data = skip_input_data;
  src->pub.resync_to_restart = jpeg_resync_to_restart; /* use default method */
  src->pub.term_source = term_source;
  //src->infile = infile;
  src->jpg.img_buffer = buffer;
  src->jpg.buffer_size = size;
  src->jpg.pos = 0;
  src->pub.bytes_in_buffer = 0; /* forces fill_input_buffer on first read */
  src->pub.next_input_byte = NULL; /* until buffer loaded */
}

通过该函数会发现:我们用户输入的buffer初始化了my_source_mgr,并用我们实现的回调函数 jpg_fill_input_buffer初始化了jpeg_source_mgr数据结构中的fill_input_buffer。这样每次 libjpeg读取数据就将会调用jpg_fill_input_buffer来读取内存jpeg数据了。

最后把jpeg_stdio_buffer_src接口暴露给最终用户。在jpeglib.h中增加如下定义:

EXTERN(void) jpeg_stdio_buffer_src JPP((j_decompress_ptr cinfo, UINT8 * buffer, UINT32 size));

至此libjpeg已经可以支持内存jpeg数据的解码了。只需要在调用jpeg_stdio_src接口的地方改调用jpeg_stdio_buffer_src就可以了。

转载:常用的OpenCV函数速查

1、cvLoadImage:将图像文件加载至内存;

2、cvNamedWindow:在屏幕上创建一个窗口;

3、cvShowImage:在一个已创建好的窗口中显示图像;

4、cvWaitKey:使程序暂停,等待用户触发一个按键操作;

5、cvReleaseImage:释放图像文件所分配的内存;

6、cvDestroyWindow:销毁显示图像文件的窗口;

7、cvCreateFileCapture:通过参数设置确定要读入的AVI文件;

8、cvQueryFrame:用来将下一帧视频文件载入内存;

9、cvReleaseCapture:释放CvCapture结构开辟的内存空间;

10、cvCreateTrackbar:创建一个滚动条;

11、cvSetCaptureProperty:设置CvCapture对象的各种属性;

12、cvGetCaptureProperty:查询CvCapture对象的各种属性;

13、cvGetSize:当前图像结构的大小;

14、cvSmooth:对图像进行平滑处理;

15、cvPyrDown:图像金字塔,降采样,图像缩小为原来四分之一;

16、cvCanny:Canny边缘检测;

17、cvCreateCameraCapture:从摄像设备中读入数据;

18、cvCreateVideoWriter:创建一个写入设备以便逐帧将视频流写入视频文件;

19、cvWriteFrame:逐帧将视频流写入文件;

20、cvReleaseVideoWriter:释放CvVideoWriter结构开辟的内存空间;

21、CV_MAT_ELEM:从矩阵中得到一个元素;

22、cvAbs:计算数组中所有元素的绝对值;

23、cvAbsDiff:计算两个数组差值的绝对值;

24、cvAbsDiffS:计算数组和标量差值的绝对值;

25、cvAdd:两个数组的元素级的加运算;

26、cvAddS:一个数组和一个标量的元素级的相加运算;

27、cvAddWeighted:两个数组的元素级的加权相加运算(alpha运算);

28、cvAvg:计算数组中所有元素的平均值;

29、cvAvgSdv:计算数组中所有元素的绝对值和标准差;

30、cvCalcCovarMatrix:计算一组n维空间向量的协方差;

31、cvCmp:对两个数组中的所有元素运用设置的比较操作;

32、cvCmpS:对数组和标量运用设置的比较操作;

33、cvConvertScale:用可选的缩放值转换数组元素类型;

34、cvCopy:把数组中的值复制到另一个数组中;

35、cvCountNonZero:计算数组中非0值的个数;

36、cvCrossProduct:计算两个三维向量的向量积(叉积);

37、cvCvtColor:将数组的通道从一个颜色空间转换另外一个颜色空间;

38、cvDet:计算方阵的行列式;

39、cvDiv:用另外一个数组对一个数组进行元素级的除法运算;

40、cvDotProduct:计算两个向量的点积;

41、cvEigenVV:计算方阵的特征值和特征向量;

42、cvFlip:围绕选定轴翻转;

43、cvGEMM:矩阵乘法;

44、cvGetCol:从一个数组的列中复制元素;

45、cvGetCols:从数据的相邻的多列中复制元素;

46、cvGetDiag:复制数组中对角线上的所有元素;

47、cvGetDims:返回数组的维数;

48、cvGetDimSize:返回一个数组的所有维的大小;

49、cvGetRow:从一个数组的行中复制元素值;

50、cvGetRows:从一个数组的多个相邻的行中复制元素值;

51、cvGetSize:得到二维的数组的尺寸,以CvSize返回;

52、cvGetSubRect:从一个数组的子区域复制元素值;

53、cvInRange:检查一个数组的元素是否在另外两个数组中的值的范围内;

54、cvInRangeS:检查一个数组的元素的值是否在另外两个标量的范围内;

55、cvInvert:求矩阵的逆;

56、cvMahalonobis:计算两个向量间的马氏距离;

57、cvMax:在两个数组中进行元素级的取最大值操作;

58、cvMaxS:在一个数组和一个标量中进行元素级的取最大值操作;

59、cvMerge:把几个单通道图像合并为一个多通道图像;

60、cvMin:在两个数组中进行元素级的取最小值操作;

61、cvMinS:在一个数组和一个标量中进行元素级的取最小值操作;

62、cvMinMaxLoc:寻找数组中的最大最小值;

63、cvMul:计算两个数组的元素级的乘积(点乘);

64、cvNot:按位对数组中的每一个元素求反;

65、cvNormalize:将数组中元素进行归一化;

66、cvOr:对两个数组进行按位或操作;

67、cvOrs:在数组与标量之间进行按位或操作;

68、cvReduce:通过给定的操作符将二维数组简为向量;

69、cvRepeat:以平铺的方式进行数组复制;

70、cvSet:用给定值初始化数组;

71、cvSetZero:将数组中所有元素初始化为0;

72、cvSetIdentity:将数组中对角线上的元素设为1,其他置0;

73、cvSolve:求出线性方程组的解;

74、cvSplit:将多通道数组分割成多个单通道数组;

75、cvSub:两个数组元素级的相减;

76、cvSubS:元素级的从数组中减去标量;

77、cvSubRS:元素级的从标量中减去数组;

78、cvSum:对数组中的所有元素求和;

79、cvSVD:二维矩阵的奇异值分解;

80、cvSVBkSb:奇异值回代计算;

81、cvTrace:计算矩阵迹;

82、cvTranspose:矩阵的转置运算;

83、cvXor:对两个数组进行按位异或操作;

84、cvXorS:在数组和标量之间进行按位异或操作;

85、cvZero:将所有数组中的元素置为0;

86、cvConvertScaleAbs:计算可选的缩放值的绝对值之后再转换数组元素的类型;

87、cvNorm:计算数组的绝对范数, 绝对差分范数或者相对差分范数;

88、cvAnd:对两个数组进行按位与操作;

89、cvAndS:在数组和标量之间进行按位与操作;

90、cvScale:是cvConvertScale的一个宏,可以用来重新调整数组的内容,并且可以将参数从一种数

据类型转换为另一种;

91、cvT:是函数cvTranspose的缩写;

92、cvLine:画直线;

93、cvRectangle:画矩形;

94、cvCircle:画圆;

95、cvEllipse:画椭圆;

96、cvEllipseBox:使用外接矩形描述椭圆;

97、cvFillPoly、cvFillConvexPoly、cvPolyLine:画多边形;

98、cvPutText:在图像上输出一些文本;

99、cvInitFont:采用一组参数配置一些用于屏幕输出的基本个特定字体;

100、cvSave:矩阵保存;

101、cvLoad:矩阵读取;

102、cvOpenFileStorage:为读/写打开存储文件;

103、cvReleaseFileStorage:释放存储的数据;

104、cvStartWriteStruct:开始写入新的数据结构;

105、cvEndWriteStruct:结束写入数据结构;

106、cvWriteInt:写入整数型;

107、cvWriteReal:写入浮点型;

108、cvWriteString:写入字符型;

109、cvWriteComment:写一个XML或YAML的注释字串;

110、cvWrite:写一个对象;

111、cvWriteRawData:写入多个数值;

112、cvWriteFileNode:将文件节点写入另一个文件存储器;

113、cvGetRootFileNode:获取存储器最顶层的节点;

114、cvGetFileNodeByName:在映图或存储器中找到相应节点;

115、cvGetHashedKey:为名称返回一个惟一的指针;

116、cvGetFileNode:在映图或文件存储器中找到节点;

117、cvGetFileNodeName:返回文件的节点名;

118、cvReadInt:读取一个无名称的整数型;

119、cvReadIntByName:读取一个有名称的整数型;

120、cvReadReal:读取一个无名称的浮点型;

121、cvReadRealByName:读取一个有名称的浮点型;

122、cvReadString:从文件节点中寻找字符串;

123、cvReadStringByName:找到一个有名称的文件节点并返回它;

124、cvRead:将对象解码并返回它的指针;

125、cvReadByName:找到对象并解码;

126、cvReadRawData:读取多个数值;

127、cvStartReadRawData:初始化文件节点序列的读取;

128、cvReadRawDataSlice:读取文件节点的内容;

129、cvGetModuleInfo:检查IPP库是否已经正常安装并且检验运行是否正常;

130、cvResizeWindow:用来调整窗口的大小;

131、cvSaveImage:保存图像;

132、cvMoveWindow:将窗口移动到其左上角为x,y的位置;

133、cvDestroyAllWindow:用来关闭所有窗口并释放窗口相关的内存空间;

134、cvGetTrackbarPos:读取滑动条的值;

135、cvSetTrackbarPos:设置滑动条的值;

136、cvGrabFrame:用于快速将视频帧读入内存;

137、cvRetrieveFrame:对读入帧做所有必须的处理;

138、cvConvertImage:用于在常用的不同图像格式之间转换;

139、cvErode:形态腐蚀;

140、cvDilate:形态学膨胀;

141、cvMorphologyEx:更通用的形态学函数;

142、cvFloodFill:漫水填充算法,用来进一步控制哪些区域将被填充颜色;

143、cvResize:放大或缩小图像;

144、cvPyrUp:图像金字塔,将现有的图像在每个维度上都放大两倍;

145、cvPyrSegmentation:利用金字塔实现图像分割;

146、cvThreshold:图像阈值化;

147、cvAcc:可以将8位整数类型图像累加为浮点图像;

148、cvAdaptiveThreshold:图像自适应阈值;

149、cvFilter2D:图像卷积;

150、cvCopyMakeBorder:将特定的图像轻微变大,然后以各种方式自动填充图像边界;

151、cvSobel:图像边缘检测,Sobel算子;

152、cvLaplace:拉普拉斯变换、图像边缘检测;

153、cvHoughLines2:霍夫直线变换;

154、cvHoughCircles:霍夫圆变换;

155、cvRemap:图像重映射,校正标定图像,图像插值;

156、cvWarpAffine:稠密仿射变换;

157、cvGetQuadrangleSubPix:仿射变换;

158、cvGetAffineTransform:仿射映射矩阵的计算;

159、cvCloneImage:将整个IplImage结构复制到新的IplImage中;

160、cv2DRotationMatrix:仿射映射矩阵的计算;

161、cvTransform:稀疏仿射变换;

162、cvWarpPerspective:密集透视变换(单应性);

163、cvGetPerspectiveTransform:计算透视映射矩阵;

164、cvPerspectiveTransform:稀疏透视变换;

165、cvCartToPolar:将数值从笛卡尔空间到极坐标(极性空间)进行映射;

166、cvPolarToCart:将数值从极性空间到笛卡尔空间进行映射;

167、cvLogPolar:对数极坐标变换;

168、cvDFT:离散傅里叶变换;

169、cvMulSpectrums:频谱乘法;

170、cvDCT:离散余弦变换;

171、cvIntegral:计算积分图像;

172、cvDistTransform:图像的距离变换;

173、cvEqualizeHist:直方图均衡化;

174、cvCreateHist:创建一新直方图;

175、cvMakeHistHeaderForArray:根据已给出的数据创建直方图;

176、cvNormalizeHist:归一化直方图;

177、cvThreshHist:直方图阈值函数;

178、cvCalcHist:从图像中自动计算直方图;

179、cvCompareHist:用于对比两个直方图的相似度;

180、cvCalcEMD2:陆地移动距离(EMD)算法;

181、cvCalcBackProject:反向投影;

182、cvCalcBackProjectPatch:图块的方向投影;

183、cvMatchTemplate:模板匹配;

184、cvCreateMemStorage:用于创建一个内存存储器;

185、cvCreateSeq:创建序列;

186、cvSeqInvert:将序列进行逆序操作;

187、cvCvtSeqToArray:复制序列的全部或部分到一个连续内存数组中;

188、cvFindContours:从二值图像中寻找轮廓;

189、cvDrawContours:绘制轮廓;

190、cvApproxPoly:使用多边形逼近一个轮廓;

191、cvContourPerimeter:轮廓长度;

192、cvContoursMoments:计算轮廓矩;

193、cvMoments:计算Hu不变矩;

194、cvMatchShapes:使用矩进行匹配;

195、cvInitLineIterator:对任意直线上的像素进行采样;

196、cvSampleLine:对直线采样;

197、cvAbsDiff:帧差;

198、cvWatershed:分水岭算法;

199、cvInpaint:修补图像;

200、cvGoodFeaturesToTrack:寻找角点;

201、cvFindCornerSubPix:用于发现亚像素精度的角点位置;

202、cvCalcOpticalFlowLK:实现非金字塔的Lucas-Kanade稠密光流算法;

203、cvMeanShift:mean-shift跟踪算法;

204、cvCamShift:camshift跟踪算法;

205、cvCreateKalman:创建Kalman滤波器;

206、cvCreateConDensation:创建condensation滤波器;

207、cvConvertPointsHomogenious:对齐次坐标进行转换;

208、cvFindChessboardCorners:定位棋盘角点;

209、cvFindHomography:计算单应性矩阵;

210、cvRodrigues2:罗德里格斯变换;

211、cvFitLine:直线拟合算法;

212、cvCalcCovarMatrix:计算协方差矩阵;

213、cvInvert:计算协方差矩阵的逆矩阵;

214、cvMahalanobis:计算Mahalanobis距离;

215、cvKMeans2:K均值;

216、cvCloneMat:根据一个已有的矩阵创建一个新矩阵;

217、cvPreCornerDetect:计算用于角点检测的特征图;

218、cvGetImage:CvMat图像数据格式转换成IplImage图像数据格式;

219、cvMatMul:两矩阵相乘;

Ref:    http://d.download.csdn.net/down/2935290/nixiangsi

      http://wenku.baidu.com/view/b8db0b16866fb84ae45c8db5.html

From: http://www.cnblogs.com/skyseraph/

windowsXP下Qt4.7解决QMYSQL编译完成后不能加载的问题

我的qt环境简介:

先安装Mysql版本5.5.13

安装mingw ,mingw安装目录为C:\MinGW

安装qt-win-opensource-4.7.3-mingw.exe,安装目录为C:\QT

安装qtcreator-2.2.1

安装均采用默认安装目录,

设置环境路径:

鼠标右键点击我的电脑图标->属性->高级->环境变量->系统变量中双击Path,在变量值中添加

C:\MinGw\bin;C:\QT\4.7.3\bin;

编译QMYSQL库:

简便起见,拷贝C:\Program Files\MySQL\MYSQL Server 5.5目录下的include和lib目录到C:\Qt\4.7.3\src\plugins\sqldrivers\mysql目录下

打开控制台,

cd C:\Qt\4.7.3\src\plugins\sqldrivers\mysql

qmake "INCLUDEPATH+=./include" "LIBS+=./lib/libmysql.lib" mysql.pro

make

make release

QMYSQL库编译完成

然后拷贝C:\Qt\4.7.3\src\plugins\sqldrivers\mysql\debug目录下两个文件:qsqlmysqld4.dll,libqsqlmysqld4.a

和C:\Qt\4.7.3\src\plugins\sqldrivers\mysql\release目录下两个文件:qsqlmysql4.dll,libqsqlmysql4.a

到C:\Qt\4.7.3\plugins\sqldrivers\下即可

还要拷贝libmysql.dll文件到C:\Qt\4.7.3\bin

注意:

我一开始编译成功QMYSQL库后,用qtcreator编程总是出现QMYSQL not loaded,主要是两个原因:

1 没有拷贝libmysql.dll到指定目录

2 没有设置好环境路径,最好不要使用qtcreator自带的mingw程序,可以将qtcreator目录下mingw目录删掉,仅使用自己安装的mingw

windows下QT的安装方法

一开始我用qt SDK安装的,发现没有mysql支持,网上的方法都是采用编译mysql支持库的方法来解决的,但这写方法需要qt source,SDK没有source所以,只好卸载SDK,安装Qt开源版本了。

Qt开源版本的下载地址:ftp://ftp.trolltech.com/qt/source/

如形为qt-win-opensource-X.X.X-mingw.exe就是基于mingw编译的QtX.X.X. 在这个下载地址中.

还要下载mingw,mingw网站:

http://sourceforge.net/project/showfiles.php?group_id=2435

首先安装mingw,然后安装qt,qt-creator最好也装上,安装qt的时候会要求寻找mingwl目录,如果不是默认安装的mingw记得要输入正确的mingw安装目录。

第 10 页,共 22 页« 最新...89101112...20...最旧 »