This forum is disabled, please visit https://forum.opencv.org

1 | initial version |

Many internal algorithms exploit the fact that the Point_ class only has the x and y coordinate data.

An example (that seems to be the source of your error) is transparent conversion between `vector<Point_<> >`

and `cv::Mat`

.

Internally, it initializes a matrix using the vector data, assuming the matrix row size to be 2 (2 dimensions in vector) and col size to be vector size. Then, it accesses the raw data using a pointer:

```
mat.data = &(vec[0].x) // this is the address of the first element in the vector
```

If the data struct only has two member vars, the next matrix column can be easily accessed by

((int*)mat.data)[j + width * i] // where w == 2.

But in the modified struct, the bool adds 32 more bits, and the conversion fails.

**Conclusion: do not mess with the OpenCV core unless you know what you're doing.**

Anyway, that is a bad programming practice, and there are many clean ways to solve your problem without modifying it. By example, create your own data struct:

```
struct MyPoint
{
cv::Point p;
bool myData;
}
```

Final word: before rushing to build a vector of points (original points) and a separate vector of bools, you should be aware of this "special property" of `std::vector<bool>`

: http://stackoverflow.com/questions/6781985/is-the-use-of-stdvectorbool-objects-in-c-acceptable-or-should-i-use-an-al

2 | No.2 Revision |

Many internal algorithms exploit the fact that the Point_ class only has the x and y coordinate data.

An example (that seems to be the source of your error) is transparent conversion between `vector<Point_<> >`

and `cv::Mat`

.

Internally, it initializes a matrix using the vector data, assuming the matrix row size to be 2 (2 dimensions in vector) and col size to be vector size. Then, it accesses the raw data using a pointer:

```
mat.data = &(vec[0].x) // this is the address of the first element in the vector
```

If the data struct only has two member vars, the next matrix column can be easily accessed by

((int*)mat.data)[j + width * i] // where w == 2.

But in the modified struct, the bool adds 32 more bits, and the conversion fails.

**Conclusion: do not mess with the OpenCV core unless you know what you're doing.**

Anyway, that is a bad programming practice, and there are many clean ways to solve your problem without modifying ~~it. ~~the core. By example, create your own data struct:

```
struct MyPoint
{
cv::Point p;
bool myData;
}
```

Final word: before rushing to build a vector of points (original points) and a separate vector of bools, you should be aware of this "special property" of `std::vector<bool>`

: http://stackoverflow.com/questions/6781985/is-the-use-of-stdvectorbool-objects-in-c-acceptable-or-should-i-use-an-al

Copyright OpenCV foundation, 2012-2018. Content on this site is licensed under a Creative Commons Attribution Share Alike 3.0 license.