图像复制

盗版拼接的想法:

之所以这么叫,是因为他根本用不上拼接的任何知识点。说起来就是一个图像的对接,或者搭上,整齐的搭在一起,不过感觉的确是有它的存在意义。比如我能想到的如果用在显微镜下的话,每次摄像机移动的步长是确定的,那么只需要把照片都按照位置整齐的排好显示出来就行了。如果有重叠的部分,只需要覆盖显示,利用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];
    }

我单独打印了某一行,结果是对的。

然后正式版本就出现了。

但是这样做好像跟,人家的函数有区别现在可以是这些一个跟人家一毛一样的,图像复制函数,之所以这样是因为,简单搜了一下,并没有找到,怎么自己写图像图像复制函数,虽然知道他真的不太难。但是毕竟如果将来要自己操作的话,这些东西自己弄出来就显得尤为必要。比如实现我的盗版拼接。

没时间了,先这样吧

2016.5.5 第二天

IplImage* myClone(IplImage* src){

    IplImage * img = cvCreateImage(cvSize(src->width, src->height), src->depth , src->nChannels);
    
    for (int i = 0; i< src->height; i++){
        for (int j = 0; j<img->widthStep; j++){
            img->imageData[img->widthStep *i + j] = src->imageData[src->widthStep *i + j];
        }
    }

    return img;
}

好了 这个就比较像,人家写好的图像复制了。接下来可以完善一下盗版拼接了。

原文地址:https://www.cnblogs.com/letben/p/5459580.html