2013-08-23 4 views
1

Я использую побитовый оператор &, но вместо результата 1 и 0 я получаю 255 и 0. В чем может быть причина? КодПобитовый & оператор возвращает 255

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 приведен array.What я делаю неправильно?

И при использовании логического оператора & & я получаю сообщение об ошибке

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

Вы не должны ожидать побитовое и быть 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

+0

О, извините, тогда я думаю, что я использую логический &&. Я пытался использовать логическое AND &&, но он дает ошибку «нет ошибки для оператора &&» – user1583647

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

OpenCV всегда дает 255 и 0 в результате логических операций, он использует предположение C/C++, что все, что не равно 0, является «истинным». Это полезно, когда вам нужно визуализировать результаты. Если вам нужны 0 и 1, просто сделайте TL_k_idx/= 255; и вы получите то, что хотите.

Смежные вопросы