mirror of
https://github.com/openmv/openmv.git
synced 2025-11-04 14:49:50 +08:00
Background Subtraction is working!!!
Woot, all the effort to make it so you can manipulate the image buffer with an image off disk works! Try out the motion_detection script.
This commit is contained in:
parent
e28d2445b1
commit
4ed49082a1
@ -22,8 +22,8 @@ bool bmp_read_geometry(FIL *fp, image_t *img, const char *path, bmp_read_setting
|
|||||||
|
|
||||||
uint32_t file_size;
|
uint32_t file_size;
|
||||||
read_long(fp, &file_size);
|
read_long(fp, &file_size);
|
||||||
read_long_ignore(fp);
|
read_word_ignore(fp);
|
||||||
read_long_ignore(fp);
|
read_word_ignore(fp);
|
||||||
|
|
||||||
uint32_t header_size;
|
uint32_t header_size;
|
||||||
read_long(fp, &header_size);
|
read_long(fp, &header_size);
|
||||||
|
|||||||
@ -406,156 +406,126 @@ void imlib_invert(image_t *img)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void imlib_and(image_t *img, const char *file, image_t *other)
|
static void imlib_and_line_op(image_t *img, int line, uint8_t *other)
|
||||||
{
|
{
|
||||||
if (IM_IS_GS(img)) {
|
if (IM_IS_GS(img)) {
|
||||||
uint8_t *pixels = img->pixels;
|
uint8_t *pixels = img->pixels + (img->w * line);
|
||||||
if (file) {
|
for (int i=0; i<img->w; i++) {
|
||||||
|
pixels[i] &= other[i];
|
||||||
} else {
|
|
||||||
uint8_t *other_pixels = other->pixels;
|
|
||||||
for (int i=0, j=img->w*img->h; i<j; i++) {
|
|
||||||
pixels[i] &= other_pixels[i];
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
uint16_t *pixels = (uint16_t *) img->pixels;
|
uint16_t *pixels = ((uint16_t *) img->pixels) + (img->w * line);
|
||||||
if (file) {
|
for (int i=0; i<img->w; i++) {
|
||||||
|
pixels[i] &= ((uint16_t *) other)[i];
|
||||||
} else {
|
|
||||||
uint16_t *other_pixels = (uint16_t *) img->pixels;
|
|
||||||
for (int i=0, j=img->w*img->h; i<j; i++) {
|
|
||||||
pixels[i] &= other_pixels[i];
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void imlib_nand(image_t *img, const char *file, image_t *other)
|
void imlib_and(image_t *img, const char *path, image_t *other)
|
||||||
|
{
|
||||||
|
imlib_image_operation(img, path, other, imlib_and_line_op);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void imlib_nand_line_op(image_t *img, int line, uint8_t *other)
|
||||||
{
|
{
|
||||||
if (IM_IS_GS(img)) {
|
if (IM_IS_GS(img)) {
|
||||||
uint8_t *pixels = img->pixels;
|
uint8_t *pixels = img->pixels + (img->w * line);
|
||||||
if (file) {
|
for (int i=0; i<img->w; i++) {
|
||||||
|
pixels[i] = ~(pixels[i] & other[i]);
|
||||||
} else {
|
|
||||||
uint8_t *other_pixels = other->pixels;
|
|
||||||
for (int i=0, j=img->w*img->h; i<j; i++) {
|
|
||||||
pixels[i] = ~(pixels[i] & other_pixels[i]);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
uint16_t *pixels = (uint16_t *) img->pixels;
|
uint16_t *pixels = ((uint16_t *) img->pixels) + (img->w * line);
|
||||||
if (file) {
|
for (int i=0; i<img->w; i++) {
|
||||||
|
pixels[i] = ~(pixels[i] & ((uint16_t *) other)[i]);
|
||||||
} else {
|
|
||||||
uint16_t *other_pixels = (uint16_t *) img->pixels;
|
|
||||||
for (int i=0, j=img->w*img->h; i<j; i++) {
|
|
||||||
pixels[i] = ~(pixels[i] & other_pixels[i]);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void imlib_or(image_t *img, const char *file, image_t *other)
|
void imlib_nand(image_t *img, const char *path, image_t *other)
|
||||||
|
{
|
||||||
|
imlib_image_operation(img, path, other, imlib_nand_line_op);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void imlib_or_line_op(image_t *img, int line, uint8_t *other)
|
||||||
{
|
{
|
||||||
if (IM_IS_GS(img)) {
|
if (IM_IS_GS(img)) {
|
||||||
uint8_t *pixels = img->pixels;
|
uint8_t *pixels = img->pixels + (img->w * line);
|
||||||
if (file) {
|
for (int i=0; i<img->w; i++) {
|
||||||
|
pixels[i] |= other[i];
|
||||||
} else {
|
|
||||||
uint8_t *other_pixels = other->pixels;
|
|
||||||
for (int i=0, j=img->w*img->h; i<j; i++) {
|
|
||||||
pixels[i] |= other_pixels[i];
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
uint16_t *pixels = (uint16_t *) img->pixels;
|
uint16_t *pixels = ((uint16_t *) img->pixels) + (img->w * line);
|
||||||
if (file) {
|
for (int i=0; i<img->w; i++) {
|
||||||
|
pixels[i] |= ((uint16_t *) other)[i];
|
||||||
} else {
|
|
||||||
uint16_t *other_pixels = (uint16_t *) img->pixels;
|
|
||||||
for (int i=0, j=img->w*img->h; i<j; i++) {
|
|
||||||
pixels[i] |= other_pixels[i];
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void imlib_nor(image_t *img, const char *file, image_t *other)
|
void imlib_or(image_t *img, const char *path, image_t *other)
|
||||||
|
{
|
||||||
|
imlib_image_operation(img, path, other, imlib_or_line_op);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void imlib_nor_line_op(image_t *img, int line, uint8_t *other)
|
||||||
{
|
{
|
||||||
if (IM_IS_GS(img)) {
|
if (IM_IS_GS(img)) {
|
||||||
uint8_t *pixels = img->pixels;
|
uint8_t *pixels = img->pixels + (img->w * line);
|
||||||
if (file) {
|
for (int i=0; i<img->w; i++) {
|
||||||
|
pixels[i] = ~(pixels[i] | other[i]);
|
||||||
} else {
|
|
||||||
uint8_t *other_pixels = other->pixels;
|
|
||||||
for (int i=0, j=img->w*img->h; i<j; i++) {
|
|
||||||
pixels[i] = ~(pixels[i] | other_pixels[i]);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
uint16_t *pixels = (uint16_t *) img->pixels;
|
uint16_t *pixels = ((uint16_t *) img->pixels) + (img->w * line);
|
||||||
if (file) {
|
for (int i=0; i<img->w; i++) {
|
||||||
|
pixels[i] = ~(pixels[i] | ((uint16_t *) other)[i]);
|
||||||
} else {
|
|
||||||
uint16_t *other_pixels = (uint16_t *) img->pixels;
|
|
||||||
for (int i=0, j=img->w*img->h; i<j; i++) {
|
|
||||||
pixels[i] = ~(pixels[i] | other_pixels[i]);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void imlib_xor(image_t *img, const char *file, image_t *other)
|
void imlib_nor(image_t *img, const char *path, image_t *other)
|
||||||
|
{
|
||||||
|
imlib_image_operation(img, path, other, imlib_nor_line_op);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void imlib_xor_line_op(image_t *img, int line, uint8_t *other)
|
||||||
{
|
{
|
||||||
if (IM_IS_GS(img)) {
|
if (IM_IS_GS(img)) {
|
||||||
uint8_t *pixels = img->pixels;
|
uint8_t *pixels = img->pixels + (img->w * line);
|
||||||
if (file) {
|
for (int i=0; i<img->w; i++) {
|
||||||
|
pixels[i] ^= other[i];
|
||||||
} else {
|
|
||||||
uint8_t *other_pixels = other->pixels;
|
|
||||||
for (int i=0, j=img->w*img->h; i<j; i++) {
|
|
||||||
pixels[i] ^= other_pixels[i];
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
uint16_t *pixels = (uint16_t *) img->pixels;
|
uint16_t *pixels = ((uint16_t *) img->pixels) + (img->w * line);
|
||||||
if (file) {
|
for (int i=0; i<img->w; i++) {
|
||||||
|
pixels[i] ^= ((uint16_t *) other)[i];
|
||||||
} else {
|
|
||||||
uint16_t *other_pixels = (uint16_t *) img->pixels;
|
|
||||||
for (int i=0, j=img->w*img->h; i<j; i++) {
|
|
||||||
pixels[i] ^= other_pixels[i];
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void imlib_xnor(image_t *img, const char *file, image_t *other)
|
void imlib_xor(image_t *img, const char *path, image_t *other)
|
||||||
|
{
|
||||||
|
imlib_image_operation(img, path, other, imlib_xor_line_op);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void imlib_xnor_line_op(image_t *img, int line, uint8_t *other)
|
||||||
{
|
{
|
||||||
if (IM_IS_GS(img)) {
|
if (IM_IS_GS(img)) {
|
||||||
uint8_t *pixels = img->pixels;
|
uint8_t *pixels = img->pixels + (img->w * line);
|
||||||
if (file) {
|
for (int i=0; i<img->w; i++) {
|
||||||
|
pixels[i] = ~(pixels[i] ^ other[i]);
|
||||||
} else {
|
|
||||||
uint8_t *other_pixels = other->pixels;
|
|
||||||
for (int i=0, j=img->w*img->h; i<j; i++) {
|
|
||||||
pixels[i] = ~(pixels[i] ^ other_pixels[i]);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
uint16_t *pixels = (uint16_t *) img->pixels;
|
uint16_t *pixels = ((uint16_t *) img->pixels) + (img->w * line);
|
||||||
if (file) {
|
for (int i=0; i<img->w; i++) {
|
||||||
|
pixels[i] = ~(pixels[i] ^ ((uint16_t *) other)[i]);
|
||||||
} else {
|
|
||||||
uint16_t *other_pixels = (uint16_t *) img->pixels;
|
|
||||||
for (int i=0, j=img->w*img->h; i<j; i++) {
|
|
||||||
pixels[i] = ~(pixels[i] ^ other_pixels[i]);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void imlib_xnor(image_t *img, const char *path, image_t *other)
|
||||||
|
{
|
||||||
|
imlib_image_operation(img, path, other, imlib_xnor_line_op);
|
||||||
|
}
|
||||||
|
|
||||||
int imlib_pixels(image_t *img, rectangle_t *r)
|
int imlib_pixels(image_t *img, rectangle_t *r)
|
||||||
{
|
{
|
||||||
rectangle_t rect;
|
rectangle_t rect;
|
||||||
@ -682,35 +652,30 @@ void imlib_negate(image_t *img)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void imlib_difference(image_t *img, const char *file, image_t *other)
|
static void imlib_difference_line_op(image_t *img, int line, uint8_t *other)
|
||||||
{
|
{
|
||||||
if (IM_IS_GS(img)) {
|
if (IM_IS_GS(img)) {
|
||||||
uint8_t *pixels = img->pixels;
|
uint8_t *pixels = img->pixels + (img->w * line);
|
||||||
if (file) {
|
for (int i=0; i<img->w; i++) {
|
||||||
|
pixels[i] = abs(pixels[i] - other[i]);
|
||||||
} else {
|
|
||||||
uint8_t *other_pixels = other->pixels;
|
|
||||||
for (int i=0, j=img->w*img->h; i<j; i++) {
|
|
||||||
pixels[i] = abs(pixels[i] - other_pixels[i]);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
uint16_t *pixels = (uint16_t *) img->pixels;
|
uint16_t *pixels = ((uint16_t *) img->pixels) + (img->w * line);
|
||||||
if (file) {
|
for (int i=0; i<img->w; i++) {
|
||||||
|
const int pixel = pixels[i], other_pixel = ((uint16_t *) other)[i];
|
||||||
} else {
|
const int r = abs(IM_R565(pixel) - IM_R565(other_pixel));
|
||||||
uint16_t *other_pixels = (uint16_t *) img->pixels;
|
const int g = abs(IM_G565(pixel) - IM_G565(other_pixel));
|
||||||
for (int i=0, j=img->w*img->h; i<j; i++) {
|
const int b = abs(IM_B565(pixel) - IM_B565(other_pixel));
|
||||||
const int pixel = pixels[i], other_pixel = other_pixels[i];
|
pixels[i] = IM_RGB565(r, g, b);
|
||||||
const int r = abs(IM_R565(pixel) - IM_R565(other_pixel));
|
|
||||||
const int g = abs(IM_G565(pixel) - IM_G565(other_pixel));
|
|
||||||
const int b = abs(IM_B565(pixel) - IM_B565(other_pixel));
|
|
||||||
pixels[i] = IM_RGB565(r, g, b);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void imlib_difference(image_t *img, const char *path, image_t *other)
|
||||||
|
{
|
||||||
|
imlib_image_operation(img, path, other, imlib_difference_line_op);
|
||||||
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
uint32_t imlib_lab_distance(struct color *c0, struct color *c1)
|
uint32_t imlib_lab_distance(struct color *c0, struct color *c1)
|
||||||
|
|||||||
@ -355,12 +355,12 @@ void imlib_draw_string(image_t *img, int x_off, int y_off, const char *str, int
|
|||||||
/* Binary functions */
|
/* Binary functions */
|
||||||
void imlib_binary(image_t *img, int num_thresholds, simple_color_t *l_thresholds, simple_color_t *h_thresholds, bool invert);
|
void imlib_binary(image_t *img, int num_thresholds, simple_color_t *l_thresholds, simple_color_t *h_thresholds, bool invert);
|
||||||
void imlib_invert(image_t *img);
|
void imlib_invert(image_t *img);
|
||||||
void imlib_and(image_t *img, const char *file, image_t *other);
|
void imlib_and(image_t *img, const char *path, image_t *other);
|
||||||
void imlib_nand(image_t *img, const char *file, image_t *other);
|
void imlib_nand(image_t *img, const char *path, image_t *other);
|
||||||
void imlib_or(image_t *img, const char *file, image_t *other);
|
void imlib_or(image_t *img, const char *path, image_t *other);
|
||||||
void imlib_nor(image_t *img, const char *file, image_t *other);
|
void imlib_nor(image_t *img, const char *path, image_t *other);
|
||||||
void imlib_xor(image_t *img, const char *file, image_t *other);
|
void imlib_xor(image_t *img, const char *path, image_t *other);
|
||||||
void imlib_xnor(image_t *img, const char *file, image_t *other);
|
void imlib_xnor(image_t *img, const char *path, image_t *other);
|
||||||
int imlib_pixels(image_t *img, rectangle_t *r);
|
int imlib_pixels(image_t *img, rectangle_t *r);
|
||||||
int imlib_centroid(image_t *img, int *x_center, int *y_center, rectangle_t *r);
|
int imlib_centroid(image_t *img, int *x_center, int *y_center, rectangle_t *r);
|
||||||
float imlib_orientation_radians(image_t *img, int *sum, int *x_center, int *y_center, rectangle_t *r);
|
float imlib_orientation_radians(image_t *img, int *sum, int *x_center, int *y_center, rectangle_t *r);
|
||||||
@ -368,7 +368,7 @@ float imlib_orientation_degrees(image_t *img, int *sum, int *x_center, int *y_ce
|
|||||||
|
|
||||||
/* Background Subtraction (Frame Differencing) functions */
|
/* Background Subtraction (Frame Differencing) functions */
|
||||||
void imlib_negate(image_t *img);
|
void imlib_negate(image_t *img);
|
||||||
void imlib_difference(image_t *img, const char *file, image_t *other);
|
void imlib_difference(image_t *img, const char *path, image_t *other);
|
||||||
|
|
||||||
/* Clustering functions */
|
/* Clustering functions */
|
||||||
array_t *cluster_kmeans(array_t *points, int k);
|
array_t *cluster_kmeans(array_t *points, int k);
|
||||||
|
|||||||
@ -439,8 +439,6 @@ static mp_obj_t py_image_and(mp_obj_t img_obj, mp_obj_t other_obj)
|
|||||||
imlib_and(arg_img, mp_obj_str_get_str(other_obj), NULL);
|
imlib_and(arg_img, mp_obj_str_get_str(other_obj), NULL);
|
||||||
} else {
|
} else {
|
||||||
image_t *arg_other = py_image_cobj(other_obj);
|
image_t *arg_other = py_image_cobj(other_obj);
|
||||||
PY_ASSERT_TRUE_MSG(IM_EQUAL(arg_img, arg_other),
|
|
||||||
"Invalid Argument: img_0_geometry != img_1_geometry");
|
|
||||||
imlib_and(arg_img, NULL, arg_other);
|
imlib_and(arg_img, NULL, arg_other);
|
||||||
}
|
}
|
||||||
return mp_const_none;
|
return mp_const_none;
|
||||||
@ -456,8 +454,6 @@ static mp_obj_t py_image_nand(mp_obj_t img_obj, mp_obj_t other_obj)
|
|||||||
imlib_nand(arg_img, mp_obj_str_get_str(other_obj), NULL);
|
imlib_nand(arg_img, mp_obj_str_get_str(other_obj), NULL);
|
||||||
} else {
|
} else {
|
||||||
image_t *arg_other = py_image_cobj(other_obj);
|
image_t *arg_other = py_image_cobj(other_obj);
|
||||||
PY_ASSERT_TRUE_MSG(IM_EQUAL(arg_img, arg_other),
|
|
||||||
"Invalid Argument: img_0_geometry != img_1_geometry");
|
|
||||||
imlib_nand(arg_img, NULL, arg_other);
|
imlib_nand(arg_img, NULL, arg_other);
|
||||||
}
|
}
|
||||||
return mp_const_none;
|
return mp_const_none;
|
||||||
@ -473,8 +469,6 @@ static mp_obj_t py_image_or(mp_obj_t img_obj, mp_obj_t other_obj)
|
|||||||
imlib_or(arg_img, mp_obj_str_get_str(other_obj), NULL);
|
imlib_or(arg_img, mp_obj_str_get_str(other_obj), NULL);
|
||||||
} else {
|
} else {
|
||||||
image_t *arg_other = py_image_cobj(other_obj);
|
image_t *arg_other = py_image_cobj(other_obj);
|
||||||
PY_ASSERT_TRUE_MSG(IM_EQUAL(arg_img, arg_other),
|
|
||||||
"Invalid Argument: img_0_geometry != img_1_geometry");
|
|
||||||
imlib_or(arg_img, NULL, arg_other);
|
imlib_or(arg_img, NULL, arg_other);
|
||||||
}
|
}
|
||||||
return mp_const_none;
|
return mp_const_none;
|
||||||
@ -490,8 +484,6 @@ static mp_obj_t py_image_nor(mp_obj_t img_obj, mp_obj_t other_obj)
|
|||||||
imlib_nor(arg_img, mp_obj_str_get_str(other_obj), NULL);
|
imlib_nor(arg_img, mp_obj_str_get_str(other_obj), NULL);
|
||||||
} else {
|
} else {
|
||||||
image_t *arg_other = py_image_cobj(other_obj);
|
image_t *arg_other = py_image_cobj(other_obj);
|
||||||
PY_ASSERT_TRUE_MSG(IM_EQUAL(arg_img, arg_other),
|
|
||||||
"Invalid Argument: img_0_geometry != img_1_geometry");
|
|
||||||
imlib_nor(arg_img, NULL, arg_other);
|
imlib_nor(arg_img, NULL, arg_other);
|
||||||
}
|
}
|
||||||
return mp_const_none;
|
return mp_const_none;
|
||||||
@ -507,8 +499,6 @@ static mp_obj_t py_image_xor(mp_obj_t img_obj, mp_obj_t other_obj)
|
|||||||
imlib_xor(arg_img, mp_obj_str_get_str(other_obj), NULL);
|
imlib_xor(arg_img, mp_obj_str_get_str(other_obj), NULL);
|
||||||
} else {
|
} else {
|
||||||
image_t *arg_other = py_image_cobj(other_obj);
|
image_t *arg_other = py_image_cobj(other_obj);
|
||||||
PY_ASSERT_TRUE_MSG(IM_EQUAL(arg_img, arg_other),
|
|
||||||
"Invalid Argument: img_0_geometry != img_1_geometry");
|
|
||||||
imlib_xor(arg_img, NULL, arg_other);
|
imlib_xor(arg_img, NULL, arg_other);
|
||||||
}
|
}
|
||||||
return mp_const_none;
|
return mp_const_none;
|
||||||
@ -524,8 +514,6 @@ static mp_obj_t py_image_xnor(mp_obj_t img_obj, mp_obj_t other_obj)
|
|||||||
imlib_xnor(arg_img, mp_obj_str_get_str(other_obj), NULL);
|
imlib_xnor(arg_img, mp_obj_str_get_str(other_obj), NULL);
|
||||||
} else {
|
} else {
|
||||||
image_t *arg_other = py_image_cobj(other_obj);
|
image_t *arg_other = py_image_cobj(other_obj);
|
||||||
PY_ASSERT_TRUE_MSG(IM_EQUAL(arg_img, arg_other),
|
|
||||||
"Invalid Argument: img_0_geometry != img_1_geometry");
|
|
||||||
imlib_xnor(arg_img, NULL, arg_other);
|
imlib_xnor(arg_img, NULL, arg_other);
|
||||||
}
|
}
|
||||||
return mp_const_none;
|
return mp_const_none;
|
||||||
@ -607,8 +595,6 @@ static mp_obj_t py_image_difference(mp_obj_t img_obj, mp_obj_t other_obj)
|
|||||||
imlib_difference(arg_img, mp_obj_str_get_str(other_obj), NULL);
|
imlib_difference(arg_img, mp_obj_str_get_str(other_obj), NULL);
|
||||||
} else {
|
} else {
|
||||||
image_t *arg_other = py_image_cobj(other_obj);
|
image_t *arg_other = py_image_cobj(other_obj);
|
||||||
PY_ASSERT_TRUE_MSG(IM_EQUAL(arg_img, arg_other),
|
|
||||||
"Invalid Argument: img_0_geometry != img_1_geometry");
|
|
||||||
imlib_difference(arg_img, NULL, arg_other);
|
imlib_difference(arg_img, NULL, arg_other);
|
||||||
}
|
}
|
||||||
return mp_const_none;
|
return mp_const_none;
|
||||||
|
|||||||
41
usr/examples/motion_detection.py
Normal file
41
usr/examples/motion_detection.py
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
# Motion Detection Example:
|
||||||
|
#
|
||||||
|
# This example demonstrates using frame differencing with your OpenMV Cam to do
|
||||||
|
# motion detection. After motion is detected your OpenMV Cam will take picture.
|
||||||
|
|
||||||
|
import os, pyb, sensor, image, time
|
||||||
|
|
||||||
|
if not "temp" in os.listdir(): os.mkdir("temp") # Make a temp directory
|
||||||
|
|
||||||
|
sensor.reset()
|
||||||
|
sensor.set_framesize(sensor.QVGA)
|
||||||
|
|
||||||
|
while(True):
|
||||||
|
sensor.set_pixformat(sensor.GRAYSCALE) # Grayscale is much faster than RGB.
|
||||||
|
|
||||||
|
# Warm up the cam
|
||||||
|
for i in range(10):
|
||||||
|
sensor.snapshot()
|
||||||
|
|
||||||
|
for i in [5, 4, 3, 2, 1]:
|
||||||
|
print("Saving background in... %d" % i)
|
||||||
|
time.sleep(1000)
|
||||||
|
|
||||||
|
print("Saving background...")
|
||||||
|
sensor.snapshot().save("temp/bg.bmp")
|
||||||
|
|
||||||
|
diff = 30 # wait 30 snapshot before taking picture
|
||||||
|
while(diff):
|
||||||
|
img = sensor.snapshot()
|
||||||
|
img.difference("temp/bg.bmp")
|
||||||
|
img.binary([(32, 255)])
|
||||||
|
sum, x, y = img.centroid()
|
||||||
|
if sum > 100: # 100 pixels detected
|
||||||
|
img.draw_cross(x, y, color = 127)
|
||||||
|
diff -= 1
|
||||||
|
|
||||||
|
sensor.set_pixformat(sensor.RGB565)
|
||||||
|
# Warm up the cam
|
||||||
|
for i in range(10):
|
||||||
|
sensor.snapshot()
|
||||||
|
sensor.snapshot().save("temp/movement-%d" % pyb.rng()) # Save movement
|
||||||
Loading…
Reference in New Issue
Block a user