1

I am using bitwise & operator but instead of 1 and 0 result I am getting 255 and 0.What could be the reason? The code is

 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............

The orientation_map is of Mat data type,the quad_coords is an array.What am I doing wrong?

And while using logical operator && I get an error

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))’|
4

3 回答 3

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

于 2013-08-23T05:52:30.040 回答
2

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

于 2013-08-23T08:15:05.993 回答
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 中处理矩阵数据的各种简单方法。

于 2013-08-23T07:07:23.447 回答