bitwise copy

有关bitwise copy的理解(个人理解,有错误请指出,谢谢)
如果class没有提供一个explict copy constructor,当class object以"相同class的另一个object"作为初值时,其内部是以所谓的default memberwise initialization手法完成的,也就是把每一个内建的或派生的data member的值,从某一个对象拷贝一份到另外一个对象上。不过它并不会拷贝其中的member class object,而是以递归的方式施行memberwise initialization(递归的意思是不调用member class 的copy constructor去复制member class object的值,而是以member class 内小单元的data进行小规模复制
程序1:
class A
{
 public:
   int i;
   A(){i=0;}
};
int   main() 
{   
    A a;
   cout<<a.i<<endl;
   A a1 = a;//调用内部的default memberwise initialization手法进行复制
   cout<<"--------"<<endl;
   cout<<a1.i<<endl;
   return 0;
}
 
相当于a1.i = a.i;
 
程序2:
但是如果在类的内部有其他类类型的情况就有所不同了:
 
class B  //Without   copy-constructor
{
 public:
      int j;
      char c;
      B(){j=2;c='B';}
};
class A
{
 public:
   int i;
   B b;
   A(){i=0;}
};
int   main() 
{   
   A a;
   cout<<a.i<<endl;
   cout<<a.b.j<<endl;
   cout<<a.b.c<<endl;
   A a1 = a;
   cout<<"--------"<<endl;
   cout<<a1.i<<endl;
   cout<<a1.b.j<<endl;
   cout<<a1.b.c<<endl;
   return 0;
}
 
相当于:
a1.i = a.i;
a1.b.j=a.b.j;
a1.b.c=a.b.c;(对b进行递归复制)
 
输出结果:
0
2
B
-----------
0
2
B
 
 
程序3:
如果类B有explict copy constructor,情况就又不一样了:
class B
{
 public:
      int j;
   char c;
   B(){j=2;c='B';}
   B(const B&){j=3;c='c';cout<<"B::copyconstructor"<<endl;}  //支持
explict copy constructor
};
class A
{
 public:
   int i;
   B b;
   A(){i=0;}
};
int   main() 
{   
   A a;
   cout<<a.i<<endl;
   cout<<a.b.j<<endl;
   cout<<a.b.c<<endl;
   A a1 = a;
   cout<<"--------"<<endl;
   cout<<a1.i<<endl;
   cout<<a1.b.j<<endl;
   cout<<a1.b.c<<endl;
   return 0;
}
 
相当于:
a1.i = a.i;
a1.b = a.b;(调用了复制构造函数,相当于对b进行整体复制)
 
输出结果:
0
2
B
B::copyconstructor
--------
0
3
c
 
 
接下来就是编译器在什么情况下会合成一个copy constructor呢?这就得视该class是否展现"bitwise copy semantics"而定,在inside the c++ object model里说的很清楚,在这里就不说了。
### 使用 OpenCV 的 `bitwise_and` 函数进行图像处理 在 OpenCV 中,`cv2.bitwise_and()` 是一种用于执行按位 AND 运算的函数。它通常被用来对两个输入数组(通常是图像)或者一个数组与一个标量值之间进行逐像素操作。当涉及到掩码 (mask) 时,可以通过设置额外参数来控制哪些区域会被保留。 #### 函数定义 以下是该函数的标准形式: ```python result = cv2.bitwise_and(src1, src2[, mask]) ``` - **src1**: 输入的第一个源图像。 - **src2**: 输入的第二个源图像。 - **mask**: 可选参数,指定要应用运算的有效区域[^1]。 如果提供了 `mask` 参数,则只有那些对应于掩码中非零位置的像素才会参与最终的结果计算。 #### 示例代码 下面是一个简单的例子展示如何利用 `bitwise_and` 和自定义掩码来进行特定部分的选择: 假设我们有两个图片 A 和 B 并希望仅显示它们重叠的部分通过创建合适的 binary mask 实现这一目标: ```python import numpy as np import cv2 # 创建示例图像A和B img_A = np.full((100, 100), 255, dtype=np.uint8) img_B = np.zeros((100, 100), dtype=np.uint8) # 在 img_B 上画一个小矩形作为兴趣区 cv2.rectangle(img_B,(30,30),(70,70),255,-1) # 定义掩模为 img_B 自身 mask = img_B.copy() # 应用 bitwise_and 处理 res = cv2.bitwise_and(img_A,img_B,mask=mask) # 显示结果 cv2.imshow('Result', res) cv2.waitKey(0) cv2.destroyAllWindows() ``` 此脚本首先生成了一个全白的图像 (`img_A`) 和另一个大部分黑色但在中心有一个白色正方形的图像 (`img_B`). 然后复制了 `img_B` 来充当我们的掩膜(mask),最后调用了 `cv2.bitwise_and()`, 结果只留下了原来两幅图共同覆盖的那一块区域[^2]. #### 关键点解释 上述程序中的核心在于理解掩码的作用以及它是怎样影响到实际输出上的每一个像素点的取舍标准。具体来说就是对于任意给定的位置 `(i,j)` ,如果满足条件 `mask[i][j]!=0 && src1[i][j]!=0 && src2[i][j]!=0` 那么就会把相应位置处三个数值都设成最小的那个;否则就全部置零表示忽略掉这部分数据不计入最终呈现效果之中去. ### 注意事项 为了获得最佳性能,请确保所有的输入图像具有相同的尺寸大小和通道数。此外,在某些情况下可能还需要调整颜色空间转换或者其他预处理步骤以便更好地匹配预期应用场景下的需求特点.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值