我正在使用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))’|
答案 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.
答案 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;你会得到你想要的东西。