之所以这么叫,是因为他根本用不上拼接的任何知识点。说起来就是一个图像的对接,或者搭上,整齐的搭在一起,不过感觉的确是有它的存在意义。比如我能想到的如果用在显微镜下的话,每次摄像机移动的步长是确定的,那么只需要把照片都按照位置整齐的排好显示出来就行了。如果有重叠的部分,只需要覆盖显示,利用step的话应该能轻松搞定,然后看一下是单通道还是三通道。总之这个是绝对可以实现的,因为这个怎么说,摄像机的移动是定步长的,也就是说除了视点以外其他的点都没有改变。
在名义上,这绝对是图像拼接,而事实上根本不需要使用特征点查找与图像融合技术。所以这么个名字应该是实至名归。
算法:
先截图得到两个可以搭上的图片。
进入vs环境。
先获取到两个图片,imread。
然后创建一个新的矩阵。
然后写一个拼接函数。出来调用。
myPicAdd(const * cvmat src1,const * cvmat src2,cvmat &dest){//假设两张图片是平行的。 //如果不匹配的话,打印提示信息,return -1; for(int i=0;i<src1.height;i++){ for(int j=0;j<dest.width;j++){ if(j<src1.width) dest[j]=src1[j]; else dest[j]=src2[j-src1.width]; } } }
主函数一调用是不是就解决问题了。
想的挺好的。
实现起来还是有点儿困难的。首先是读取图像,接下来参数传递,实现拼接,然后就发现,每次只是出一行,或者不出结果。然后发现有些很基础的算法要实现。比如要是能实现一张图片的复制,在把另外一张图片加进来是不是就很容易。发现连这个都很难做到。主要是对cvmat mat iplimage cvarr很陌生,每个里面什么参数都不晓得,然后是关于 指针引用,参数传递不是很熟。
现在把可行版发布:
先是:图像复制,自己写的图像复制,如果这个写出来了,那么后面实现opencv里面的函数也就轻而易举了。
我的图像复制
可运行版本:
void myClone(IplImage* src1, IplImage* dest){for (int i = 0; i< src1->height; i++){ for (int j = 0; j<dest->width*3; j++){ dest->imageData[dest->widthStep *i + j] = src1->imageData[src1->widthStep *i + j]; } } }
算法里面这样写:
dest.data[j] = src1.data[j];
都知道里面存的是矩阵,如果是一个一维矩阵的数字罗列这样就很简单。
事实上并不是,这样写就只能复制头一行。
改进第一版本:
for (int i = 0; i< src1->height; i++){ for (int j = 0; j<dest->width*3; j++){ printf("%d", src1->imageData[j]); dest->imageData[i+j] = src1->imageData[i+j]; } }
想想会怎样?理论上应该是没问题的,但是其实,结果是我的每次都只复制了一行半的内容。后面198行半都是灰的。【为了运行方便我从我的屏幕上截取了154*200的图片。】
这个很奇怪。
原因在于第一行的首地址的确是dest->imageData[i+j] 可是第二行不是。
如果能想到这里
for (int j = 0; j<dest->width * 3; j++){ printf("%d", src1->imageData[j]); dest->imageData[j] = src1->imageData[src1->widthStep * 50+j]; }
我单独打印了某一行,结果是对的。
然后正式版本就出现了。
但是这样做好像跟,人家的函数有区别现在可以是这些一个跟人家一毛一样的,图像复制函数,之所以这样是因为,简单搜了一下,并没有找到,怎么自己写图像图像复制函数,虽然知道他真的不太难。但是毕竟如果将来要自己操作的话,这些东西自己弄出来就显得尤为必要。比如实现我的盗版拼接。
没时间了,先这样吧