盗版拼接

昨天想到的这个想法,所以东西的原理都在那个里面。

但是实现起来,发现竟然十分困难而且之前看到的很多点都忘记了,所以想到要制作一个关于《图像拼接不得不知的点》这样一个博文。因为审核的缘故,发现写随笔更适合有点儿什么东西就写一下,所以,这个里面更多的是每天的一点儿小积累。

而csdn更像是一个文章,审核也比较严,大牛也感觉起来很多,所以发一些总结性质的东西。

想了一下,随笔里面应该把csdn的东西都弄进来。这样加上本身博客园的同作者名下的检索功能,就十分犀利了。

一下盗版拼接,我想说的确在定点摄像头移动的情况下,输入多组图片从而实现的拼接是有可行性的,所谓大繁至简,如果能用简单的方式实现,那么我们并不需要把问题复杂化。

所以 这种是图片叠加的方式:

#include <cv.h>
#include <opencv2/core/core.hpp>  
#include <opencv2/highgui/highgui.hpp>  

using namespace cv;

void myPicAdd(Mat& src1, Mat& src2, Mat& dest){//并不可用
    //如果不匹配的话,打印提示信息,return -1;
        for (int i = 0; i< src1.rows; i++){
            for (int j = 0; j<dest.cols; j++){
                if (j<src1.cols)
                    dest.data[j] = src1.data[j];
                else
                    dest.data[j] = src2.data[j - src1.cols];
            }
        }
}

using namespace std;
void myClone(IplImage* src1, IplImage* dest){//图像复制第一版
    for (int i = 0; i< src1->height; i++){
        for (int j = 0; j<dest->widthStep; j++){
            dest->imageData[dest->widthStep *i + j] = src1->imageData[src1->widthStep *i + j];
        }
    }
}


void myPicAdd(IplImage* src1, IplImage* src2, IplImage* dest){//图像叠加

    for (int i = 0; i< src1->height; i++){
        for (int j = 0; j<dest->widthStep; j++){
            if (j<src1->widthStep)
                dest->imageData[dest->widthStep *i + j] = src1->imageData[src1->widthStep *i + j];
            else 
                dest->imageData[dest->widthStep *i + j] = src2->imageData[src2->widthStep *i + j-src1->widthStep];
        }
    }
}

int main()
{
    IplImage* img1 = cvLoadImage("p2.jpg");
    IplImage* img2 = cvLoadImage("p3.jpg");
    IplImage* img3 = cvCreateImage(cvSize(310, 200), 8, 3);

    myPicAdd(img2, img1, img3);
    cvShowImage("d",img3);

    waitKey(0);
}
IplImage* myPicAdd(IplImage* src1, IplImage* src2){//可用然而复杂情况并未考虑
    //先考虑通道数相同的情况。并且两个高度相同的情况。
    
    IplImage * img = cvCreateImage(cvSize(src1->width + src2->width, src1->height), src1->depth, src1->nChannels);

    if (src1->nChannels == src2->nChannels){
        for (int i = 0; i< src1->height; i++){
            for (int j = 0; j<img->widthStep; j++){
                if (j<src1->widthStep)
                    img->imageData[img->widthStep *i + j] = src1->imageData[src1->widthStep *i + j];
                else
                    img->imageData[img->widthStep *i + j] = src2->imageData[src2->widthStep *i + j - src1->widthStep];
            }
        }
    }

    return img;
}
IplImage* myPicAdd(IplImage* src1, IplImage* src2){//高度不同问题已经解决
    //先考虑通道数相同的情况。
    int height = src1->height;
    if (src1->height<src2->height){
        height = src2->height;
    }
    
    IplImage * img = cvCreateImage(cvSize(src1->width + src2->width, height), src1->depth, src1->nChannels);

    if (src1->nChannels == src2->nChannels){
        for (int i = 0; i<height; i++){
            for (int j = 0; j<img->widthStep; j++){
                if (j < src1->widthStep)
                {
                    if (i < src1->height)
                        img->imageData[img->widthStep *i + j] = src1->imageData[src1->widthStep *i + j];
                    else
                        img->imageData[img->widthStep *i + j] = 0;
                }
                else{
                    if (i < src2->height)
                        img->imageData[img->widthStep *i + j] = src2->imageData[src2->widthStep *i + j - src1->widthStep];
                    else
                        img->imageData[img->widthStep *i + j] = 0;
                }
            }
        }
    }

    return img;
}

今天的问题出现在我把 解决功能和 函数抽象【也可以叫做算法优化放在了一起】导致什么也没做出来的窘境,所以吸取的教训是,要先实现功能,然后在进行优化。优化是在写熟练地基础上,慢慢诞生的感觉。如果功能没有实现,就想优化,一气呵成。这个就不太现实。所以写一个随笔叫做压合细节。

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