findContours() error with cairo
Hi, I'm using Kinect with OpenCV 2.4.5 using freenect. Below is my code:
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <libfreenect.h>
#include <pthread.h>
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <stdlib.h>
#include <iostream>
using namespace cv;
using namespace std;
Mat img_depth;
Mat img_rgb;
Mat img_temp;
Mat img_canny;
Mat img_canny_temp;
pthread_mutex_t mutex_depth = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t mutex_rgb = PTHREAD_MUTEX_INITIALIZER;
pthread_t cv_thread;
//callback for depthimage, called by libfreenect
void depthCallback(freenect_device *dev, void *depth, uint32_t timestamp)
{
Mat depth8;
Mat mydepth = Mat(Size(640, 480), CV_16UC1, depth);
mydepth.convertTo(depth8, CV_8UC1, 1.0/4.0);
pthread_mutex_lock(&mutex_depth);
memcpy(img_depth.data, depth8.data, 640*480);
//unlock mutex
pthread_mutex_unlock(&mutex_depth);
}
//callback for rgbimage, called by libfreenect
void RGBCallback(freenect_device *dev, void *rgb, uint32_t timestamp)
{
//lock mutex for opencv rgb image
pthread_mutex_lock(&mutex_rgb);
memcpy(img_rgb.data, rgb, FREENECT_VIDEO_RGB_SIZE);
//unlock mutex
pthread_mutex_unlock(&mutex_rgb);
}
/*
* thread for displaying the opencv content
*/
void *cv_threadfunc(void *ptr)
{
img_depth = Mat(Size(640, 480), CV_8UC1);
img_rgb = Mat(Size(640, 480), CV_8UC3);
img_temp = Mat(Size(640, 480), CV_8UC3);
img_canny = Mat(Size(640, 480), CV_8UC1);
img_canny_temp = Mat(Size(640, 480), CV_8UC1);
//use image polling
while(1)
{
//lock mutex for depth image
pthread_mutex_lock(&mutex_depth);
vector< vector<Point> > contours;
Canny(img_depth, img_canny, 60, 110);
findContours(img_canny, contours, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE);
imshow("First",img_thresh);
imshow("Canny", img_canny);
//unlock mutex for depth image
pthread_mutex_unlock(&mutex_depth);
//lock mutex for rgb image
pthread_mutex_lock(&mutex_rgb);
//show image to window
cvtColor(img_rgb,img_temp,CV_BGR2RGB);
imshow("Second", img_temp);
//unlock mutex
pthread_mutex_unlock(&mutex_rgb);
//wait for quit key
if(cvWaitKey(15) == 27)
{
break;
}
}
pthread_exit(NULL);
return NULL;
}
int main(int argc, char **argv)
{
freenect_context *f_ctx;
freenect_device *f_dev;
int res = 0;
int die = 0;
printf("Kinect camera test\n");
if(freenect_init(&f_ctx, NULL) < 0)
{
printf("freenect_init() failed\n");
return 1;
}
if(freenect_open_device(f_ctx, &f_dev, 0) < 0)
{
printf("Could not open device\n");
return 1;
}
freenect_set_depth_callback(f_dev, depthCallback);
freenect_set_video_callback(f_dev, RGBCallback);
freenect_set_video_format(f_dev, FREENECT_VIDEO_RGB);
//create opencv display thread
res = pthread_create(&cv_thread, NULL, cv_threadfunc, NULL);
if(res)
{
printf("pthread_create failed\n");
return 1;
}
printf("init done\n");
freenect_start_depth(f_dev);
freenect_start_video(f_dev);
while(!die && freenect_process_events(f_ctx) >= 0);
}
The error I'm getting is as follows:
/build/buildd/cairo-1.10.2/src/cairo-surface.c:1287: cairo_surface_set_device_offset: Assertion `status == CAIRO_STATUS_SUCCESS' failed. Aborted (core dumped)
I spent 5 hours on the internet searching for this, but still am clueless about this. Please help.
i see a ton of code there, but nothing even vaguely related to cairo
As it turns out there was nothing wrong with my code. It was giving a problem just because my terminal always loads ROS bindings.
Hello Siddharth, I have the same problem when using OpenCV's findContours() function. However, I am using the OpenCV library in a ROS node, hence, I do require the ROS bindings. Any ideas how to fix the problem or what exactly causes the crash?
Thanks, Heiko