山寨版Google识图

         这个图片检索主要是对上一次做的检索的优化,上次作了第一个检索系统后这次做感觉轻松多了。

         这次也可以说成是对上次的一次优化,首先是图片地址使用了相对路径,再其次就是更改了数据库的结构(原来的那个貌似连第一范式都不满足)。

        首先是相对路径,这里主要参考了这篇文章,http://www.myexception.cn/c-sharp/79097.html这里值得注意的是我们写的代码的程序在\WindowsFormsApplication42\bin\Debug\......exe中的exe文件,之前还写了一个把已知路径转换为相对路径的小程序,但是考虑到我也就把照片都放进一个文件夹,就没用。还有就是这种在代码中写路径的方法

DirectoryInfo dicInfo = new DirectoryInfo(@"E:\ski");//注意这种@写路径的方法
        接下来就是存到数据库里,我当时的思路是把每张灰度直方图的256个数用逗号隔开,变成字符串,但是遇到的问题是,有的数是四位数,256个数的话存成一个字符串太长了,会在数据库中占用很多存储空间,但是可以勉强存下。同时我这次没有使用存储过程存进数据库,直接使用的是sql语句,虽然说不太清楚优劣,但是感觉存储过程有点麻烦,哈哈。当然也不得不说上学期学的数据库课对这里很有帮助。下面是一句挺值得注意的存储方法。
d.InsertCommand = new SqlCommand("INSERT INTO picture(path,histogram)Values('" + strFileName + "',+'" + teststring + "')", cn);//非常经典的存储方法

这里还有很低级的问题,我忘记怎么声明数组了,看了这篇文章http://wenku.baidu.com/view/2c59bd8a6529647d27285257.html

int[] numbers; // declare numbers as an int array of any size特别是这里,可以声明任意长度的数组,感觉挺有用的,字符串也同样适用。

       因为考虑到之前256个数实在是太长了,所以换了一个检索函数(其实本想好好研究opencv中提取图像特征值的问题的,但是底子太薄了),主要看了这篇文章http://www.mikel.cn/%E5%BC%80%E5%8F%91%E7%AC%94%E8%AE%B0/%E8%BD%AC%E8%BD%BD%E6%84%9F%E7%9F%A5%E5%93%88%E5%B8%8C%E7%AE%97%E6%B3%95-%E6%89%BE%E5%87%BA%E7%9B%B8%E4%BC%BC%E7%9A%84%E5%9B%BE%E7%89%87.html与他不同的是我没有用记事本,而是使用了数据库,不过64个二进制数确实节省了很多存储空间,同时也省去了加逗号的过程。文章中的第一步我是用了这种方法,因为他的我没看懂。

imgOutput1 = new Bitmap(img, 8, 8);

使图片变为8*8大小,同时需要提醒的是那64个数是由同一张图各点与它自己各点的平均值比较得出的结果。这种写大小的方法感觉挺简洁

Byte[] grayValues = new Byte[image.Width * image.Height];
还有这种写数组长度的写法
char[] result = new char[values.Length];
同时它里面的数字没有使用int而是使用的是byte,估计可以节省点内存。也因此又重新写了存数据的代码,我就是直接把相对路径加到文件名前。
string strFileName = "../../../../../ski/" + fileInfo.Name;
因为之前应该是把字符串转换为数组的,所以有些了一小段代码,但是现在就用不上了。分割的话主要是在这里学习的, http://www.cnblogs.com/server-you/archive/2006/09/20/509342.html而且spilt函数直接就存为数组实在是太强大了。转换格式的话就直接
numVal[i] = Convert.ToInt32(sArray[i]);
这个很基础了。

         终于可以到了最后的检索程序了,我在这个程序中加入了下一页,上一页按钮,这样的话就应该是不总是可用的,默认不可用可以在可以在按钮的属性中更改enabled就可以,在代码中激活的话,就使用

button3.Enabled = true;
然后是下一页、上一页功能的实现,开始时自己写的,很麻烦还有错后来受到这篇文章的启发, http://zhidao.baidu.com/question/248687633.html,不同的是他是下一张、上一张,我设定的是一页五张于是把i替换为我这里的page,然后用的时候乘五。感觉不错粘过来分享一下。
 if (sArray[1] != null)
                    pictureBox1.Image = Image.FromFile(sArray[1]);
                if (sArray.Length - 1>=2)
                    pictureBox2.Image = Image.FromFile(sArray[2]);
                if (sArray.Length - 1 >= 3)
                    pictureBox3.Image = Image.FromFile(sArray[3]);
                if (sArray.Length - 1 >= 4)
                    pictureBox4.Image = Image.FromFile(sArray[4]);
                if (sArray.Length - 1 >= 5)
                    pictureBox5.Image = Image.FromFile(sArray[5]);
              if(sArray.Length-6<=0)
                  button3.Enabled=false;
              else
                  button3.Enabled = true;
              
            }
            
            imgOutput.Dispose();

        }

        private void button3_Click(object sender, EventArgs e)
        {
            page++;
            if (sArray.Length - (1 + page * 5) >= 1)
                pictureBox1.Image = Image.FromFile(sArray[1+page*5]);
            if (sArray.Length - (1+page*5) >= 2)
                pictureBox2.Image = Image.FromFile(sArray[2 + page * 5]);
            else
                pictureBox2.Image = null;
            if (sArray.Length - (1 + page * 5) >= 3)
                pictureBox3.Image = Image.FromFile(sArray[3 + page * 5]);
             else
                pictureBox3.Image = null;
            if (sArray.Length - (1 + page * 5) >= 4)
                pictureBox4.Image = Image.FromFile(sArray[4 + page * 5]);
            else
                pictureBox4.Image = null;
            if (sArray.Length - (1 + page * 5) >= 5)
                pictureBox5.Image = Image.FromFile(sArray[5 + page * 5]);
            else
                pictureBox5.Image = null;
           
            if (sArray.Length - (6+page*5) <= 0)
                button3.Enabled = false;
            
            if (page > 0)
                button4.Enabled = true;
        }

        private void button4_Click(object sender, EventArgs e)
        {
            page--;
            if (sArray.Length - (1 + page * 5) >= 1)
                pictureBox1.Image = Image.FromFile(sArray[1 + page * 5]);
            if (sArray.Length - (1 + page * 5) >= 2)
                pictureBox2.Image = Image.FromFile(sArray[2 + page * 5]);
            else
                pictureBox2.Image = null;
            if (sArray.Length - (1 + page * 5) >= 3)
                pictureBox3.Image = Image.FromFile(sArray[3 + page * 5]);
            else
                pictureBox3.Image = null;
            if (sArray.Length - (1 + page * 5) >= 4)
                pictureBox4.Image = Image.FromFile(sArray[4 + page * 5]);
            else
                pictureBox4.Image = null;
            if (sArray.Length - (1 + page * 5) >= 5)
                pictureBox5.Image = Image.FromFile(sArray[5 + page * 5]);
            else
                pictureBox5.Image = null;

            if (sArray.Length - (6 + page * 5) <= 0)
                button3.Enabled = false;
            if (page > 0)
                button4.Enabled = true;
            else
                button4.Enabled = false;
然后又做了一下界面的美化,给form加了背景,同时把其他控件背景改为透明,这些都是在属性里直接更改就可以,还都是数据库老师教的呢。这次是把所有的地址村成了字符串然后分开(之前貌似没有白写哈哈)
resultpath +=  ","+strFileName ;
                        i++;
                    }
                   
                }

                 sArray = resultpath.Split(',');

        总结一下这次比上次做起来感觉轻松多了,而且都联系到专业课的知识了,感觉学有所用,很高兴,但是本该早就完成的,还是自己太贪玩了。希望大家看后有所收获

        代码下载地址:http://download.csdn.net/detail/liangshanxiaohan/7212911


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值