当前位置: 首页 > news >正文

压合细节

诞生于盗版拼接:

实现两幅图片硬生生的压合:

不过还是有问题没有处理到:

第一版:
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];
        }
    }
}

第二版:
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<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){
    //先考虑通道数相同的情况。并且两个高度相同的情况。
    
    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
                    img->imageData[img->widthStep *i + j] = src2->imageData[src2->widthStep *i + j - src1->widthStep];
            }
        }
    }
    return img;
}

然后倒过来输出,总是差一个颜色。比如:

这个不对劲啊。

然后后面还有一个:

原图是这个样子的

发现本来是大红的颜色,错了位,并且输出了一个大绿色。

这个明暗度,感觉完全是RGB混了。

或者 根据本来应该是红色变成了绿色。

放大以后可以看到,红色往前走了一位。如果把红色往后推一位。绿色就对上了,所有的东西就应该都对上了。所以结果就是红色提前输出了一位。应该是。红色为什么会提前输出一位呢?
嗯:回到原始版本来解决问题:

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+1] = src2->imageData[src2->widthStep *i + j-src1->widthStep];
        }
    }
}

因为发现有一个颜色的错位,所以:上面加深加下划线的地方表示修改。这样两幅图片倒着输出,就没有问题了。

于是 修改:

后面版本的拼接得到:

前后对着的,但是中间的不对劲。

于是在调试过程中继续找到基本版的picAdd

发现果然正过来,有问题。倒着是没问题了,正过来出了问题,结果应该也在+1上。如果去掉必然好使,接下来就在于,为什么?为什么差一个字节,这一个字节的差出现在哪里?

 

我现在有点儿持盾。。。

正过来:
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];
        }
    }

倒过来:
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+1] = src2->imageData[src2->widthStep *i + j-src1->widthStep];
        }
    }

都对,不过中间有一条线,为什么会有一条线,所以其实倒过来也不对吧。或者 本身左边有一条线?

 

左边本不该有一条线的。的确没有,接下来看看右图的右边有没有线,右图的右边也没有线。

 

平白无故多条线?

-2白线消失 中间加的越多白线越粗,并且 会报出异常。

 

所以问题出在哪里?!~难道是读取的时候,按照rgb或者bgr的方式读取的?!所以造成了结果的不一致?

 

结果是-2貌似更正确

虽然有色差,但是中间没有多余的线了。接下来就是 什么时候会多线,为什么会多线?【我靠!!!!刚看见,前面没有了,后面还多一条黄线!!!蒙蔽 蒙蔽 蒙蔽】


我对自己说:先不要弄3通道的,先用1通道的试试。

 

于是发现了中间多了两条线【因为看了太多次一条线了】。所以忽然想起一个事儿,就是 左边的图是154个像素,右边是156个,刚好差两个像素,所以下次试验这个实验对象也很重要,要不然结果就分析不出来了,差点儿啊~~~下次两幅图片中间的差值,换大一点儿吧。2个像素真的很微妙。所以这样也就为我们实现多图压合,创造了教训。

 

所以就必须是先左后右,这就是压合顺序。要是先进来的后被压合才奇怪吧。

 

不过为什么会差一条线呢?!~

心好累,可能已经到了极限了吧,或许同一天做一个事情太久,就会顶了的。

 

或许需要休息一下了。干点儿别的事情。

 

今天的问题先记录一下,明天继续处理。

 

转载于:https://www.cnblogs.com/letben/p/5462356.html

相关文章:

  • windows下安装python科学计算环境,numpy scipy scikit ,matplotlib等
  • IC卡的传输协议(2)-块传输协议T=1续【转】
  • Elasticsearch 2.3.0 老版本升级指南
  • java web
  • Office online server 部署
  • JRE与JDK简介
  • ConcurrentHashMap
  • Oracle语句异常
  • jmeter 302请求测试
  • 基于Volley网络库实现加载多种网络图片(包括GIF动态图片、圆形图片、普通图片)...
  • Scrum4.0
  • 通过来模仿稀土掘金个人页面的布局来学习使用CoordinatorLayout
  • 打印出100到999的水仙花数
  • HDOJ/HDU 2568 前进(简单题)
  • java实现上传图片进行切割
  • 《Java编程思想》读书笔记-对象导论
  • dva中组件的懒加载
  • iOS 颜色设置看我就够了
  • java中具有继承关系的类及其对象初始化顺序
  • k个最大的数及变种小结
  • maya建模与骨骼动画快速实现人工鱼
  • miaov-React 最佳入门
  • 对话:中国为什么有前途/ 写给中国的经济学
  • 翻译:Hystrix - How To Use
  • 老板让我十分钟上手nx-admin
  • 悄悄地说一个bug
  • 如何利用MongoDB打造TOP榜小程序
  • 思否第一天
  • 译米田引理
  • MiKTeX could not find the script engine ‘perl.exe‘ which is required to execute ‘latexmk‘.
  • [Shell 脚本] 备份网站文件至OSS服务(纯shell脚本无sdk) ...
  • 阿里云IoT边缘计算助力企业零改造实现远程运维 ...
  • (12)目标检测_SSD基于pytorch搭建代码
  • (C语言)字符分类函数
  • (笔试题)分解质因式
  • (待修改)PyG安装步骤
  • (第一天)包装对象、作用域、创建对象
  • (机器学习-深度学习快速入门)第三章机器学习-第二节:机器学习模型之线性回归
  • (三)docker:Dockerfile构建容器运行jar包
  • (四)Tiki-taka算法(TTA)求解无人机三维路径规划研究(MATLAB)
  • (算法)Game
  • (淘宝无限适配)手机端rem布局详解(转载非原创)
  • (五)IO流之ByteArrayInput/OutputStream
  • (终章)[图像识别]13.OpenCV案例 自定义训练集分类器物体检测
  • (转)Google的Objective-C编码规范
  • (转)如何上传第三方jar包至Maven私服让maven项目可以使用第三方jar包
  • (转)四层和七层负载均衡的区别
  • *p=a是把a的值赋给p,p=a是把a的地址赋给p。
  • .NET Core中Emit的使用
  • .NET Micro Framework 4.2 beta 源码探析
  • .net web项目 调用webService
  • .NET 动态调用WebService + WSE + UsernameToken
  • .NET 同步与异步 之 原子操作和自旋锁(Interlocked、SpinLock)(九)
  • .NET(C#、VB)APP开发——Smobiler平台控件介绍:Bluetooth组件
  • @Documented注解的作用