标签:
昨天想到的这个想法,所以东西的原理都在那个里面。
但是实现起来,发现竟然十分困难而且之前看到的很多点都忘记了,所以想到要制作一个关于《图像拼接不得不知的点》这样一个博文。因为审核的缘故,发现写随笔更适合有点儿什么东西就写一下,所以,这个里面更多的是每天的一点儿小积累。
而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; }
今天的问题出现在我把 解决功能和 函数抽象【也可以叫做算法优化放在了一起】导致什么也没做出来的窘境,所以吸取的教训是,要先实现功能,然后在进行优化。优化是在写熟练地基础上,慢慢诞生的感觉。如果功能没有实现,就想优化,一气呵成。这个就不太现实。所以写一个随笔叫做压合细节。
标签:
原文地址:http://www.cnblogs.com/letben/p/5462320.html