2013-05-22 6 views
2

Я столкнулся с очень странным вопросом с OpenCV для Android: когда я доступ к пикселю с Mat.at это дает мне неправильный пиксель на экране: Простого пример:OpenCV Android неправильно координаты

for(double y = (mat.rows - h)/2 ; y < (mat.rows + h)/2 ; y++) { 
    for(double x = (mat.cols - w)/2; x < (mat.cols + w)/2; x++) { 
     for(int c = 0; c < 3; c++) { 
      mat.at<Vec3b>(y,x)[c] = 
       saturate_cast<uchar>(255); 

     } 
    } 
} 

circle(mat, Point((mat.cols - w)/2, (mat.rows - h)/2), 10, Scalar(255,0,0,255)); 
circle(mat, Point((mat.cols + w)/2, (mat.rows - h)/2), 10, Scalar(255,0,0,255)); 
circle(mat, Point((mat.cols - w)/2, (mat.rows + h)/2), 10, Scalar(255,0,0,255)); 
circle(mat, Point((mat.cols + w)/2, (mat.rows + h)/2), 10, Scalar(255,0,0,255)); 

У меня должны быть углы, выровненные с коробкой, но нет. Есть ли конверсия для доступа к истинным координатам?

enter image description here

ответ

0

Это длинный выстрел, но это может помочь вам. Является ли это эмуляцией SDK? Я помню, что с тобой были проблемы. Когда я попробовал свой код на устройстве, он работал как шарм.

+0

Нет на устройстве (samsung S3) – luxcem

1

Вы не публикуете инициализацию mat, но она представляется инициализированной как тип CV_8UC4. Это означает, что доступ к изображению с использованием mat.at<cv::Vec3b> даст вам неправильные местоположения пикселей. Доступ к четырехканальным изображениям можно получить с помощью at<cv::Vec4b>, чтобы обеспечить правильное расположение пикселей, даже если вы только изменяете три канала, как в вашем примере.

Несвязанный: нецелесообразно использовать double в качестве переменной счетчика.

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