zoukankan      html  css  js  c++  java
  • 图像复制

    盗版拼接的想法:

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

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

  • 相关阅读:
    哈希表--扩展数组
    哈希表效率
    P=(1+1/(1-L))/2
    函数推进
    简单函数2
    简单函数
    getting data from the keybroad
    nutch-2.2.1 hadoop-1.2.1 hbase-0.92.1 集群部署(实用)
    hbase zookeeper独立搭建
    Orchard 介绍
  • 原文地址:https://www.cnblogs.com/letben/p/5459580.html
Copyright © 2011-2022 走看看