按位&运算符返回255

时间:2013-08-23 05:43:25

标签: c++ opencv

我正在使用bitwise&运算符,而不是1和0结果我得到255和0.这可能是什么原因? 代码是

 cv::Mat TL_k_idx = ((orientation_map.col(0)<=(quad_coords[0]+quad_coords[2])/2) & (orientation_map.col(1)<=(quad_coords[1]+quad_coords[3])/2));
cout<<TL_k_idx;

The output of TL_k_idx is:
255 255 255 255 0 0............

orientation_map是Mat数据类型,quad_coords是数组。我做错了什么?

使用逻辑运算符&amp;&amp;我收到错误

error: no match for ‘operator&&’ in ‘cv::operator<=(const cv::Mat&, double)((double)((*
(quad_coords) + *(quad_coords + 8u)) / 2)) && cv::operator<=(const cv::Mat&, double)((double)((*
(quad_coords + 4u) + *(quad_coords + 12u)) / 2))’|

3 个答案:

答案 0 :(得分:4)

您不应期望按位为0或1。

以下是255的事情:

a = 255 & 255 // then a = 255;

以下是几个例子

Example 1    11111111 & 11111111 = 11111111 or 255

Example 2: 01010101 & 00000111 = 101 or 5.

http://en.wikipedia.org/wiki/Bitwise_operations_in_C

答案 1 :(得分:2)

您正在混合对本机(原始)C / C ++类型和OpenCV类的操作。

根据您的问题,我了解您要创建与方向图的第一列和第二列大小相同的列向量,然后用一些结果填充它。这是一个提案:

/* Create the output as the copy of the 1st col */
cv::Mat TL_k_idx = orientation_map.col(0).clone(); 

/* Now, fill it with the correct result by looping over the elements */
for (row = 0; row < TL_k_idx.rows; ++i)
{
  float col0_elem = TL_k_idx.at<float>(row);  // I assume you have float data;
                                              // Change according to your type.
  TL_k_idx.at<float>(row) = ( col0_elem <=(quad_coords[0]+quad_coords[2])/2) ) &&
                            ( orientation_map.col(1).at<float>(row)<=(quad_coords[1]+quad_coords[3])/2) );
} 

这个版本没有优化(我会在我自己的代码中使用直接指向数据的指针),但这里的目的是演示在OpenCV中处理矩阵数据的各种简单方法。

答案 2 :(得分:2)

OpenCV总是给出255和0作为逻辑运算的结果,它使用C / C ++的假设,即所有非0都是“真”。当您需要可视化结果时,它是有用的。如果你需要0和1,那就做TL_k_idx / = 255;你会得到你想要的东西。