Ask Your Question
0

opencv-3.2.0(x64): drawContours does not work with Qt5

asked 2017-04-26 02:45:16 -0600

Svad gravatar image

updated 2017-04-26 07:00:48 -0600

Hello,

I builded opencv 3.2.0 for x64 and try to use function drawContours in my Qt5 concole application, and it does not work. The code below.

 Mask = Mat(rows, cols, CV_8UC1, cv::Scalar(0));
const vector<Point> obj_corners = { Point(x_bgn, y_bgn), Point(x_end, y_bgn), Point(x_end, y_end), Point(x_bgn, y_end) };
const vector< vector<Point> >  co_ordinates = { obj_corners };
drawContours(Mask, co_ordinates, 0, Scalar(255), CV_FILLED);

The problem is that drawContours completes before it do something.

The source part of drawContours below.

void cv::drawContours( InputOutputArray _image, InputArrayOfArrays _contours,
               int contourIdx, const Scalar& color, int thickness,
               int lineType, InputArray _hierarchy,
               int maxLevel, Point offset ){
CV_INSTRUMENT_REGION()

Mat image = _image.getMat(), hierarchy = _hierarchy.getMat();
CvMat _cimage = image;

size_t ncontours = _contours.total();
size_t i = 0, first = 0, last = ncontours;
std::vector<CvSeq> seq;
std::vector<CvSeqBlock> block;

if( !last )
    return;

Variable last is false and drawContours complete. I found out that problem is method total() - it returns zero. The code below works exactly the same - ncount equal zero.

const vector<Point> obj_corners = { Point(x_bgn, y_bgn), Point(x_end, y_bgn), Point(x_end, y_end), Point(x_bgn, y_end) };       
const vector< vector<Point> >  co_ordinates = { obj_corners };
InputArrayOfArrays con = co_ordinates;
size_t ncount = con.total();

In x86 verson of opencv all works fine. What I do wrong?

UPDATE: I am using Win7(x64) and VC14. I try to use standart build of opencv from archive opencv-3.2.0-vc14.exe and result the same. UPDATE2: Problem solved. In Debug configuration of my test project uses /MD key instead of /MDd(Project->Properties->C/C++->Code Generation->Runtime Library).

edit retag flag offensive close merge delete

Comments

mask is empty.

LBerger gravatar imageLBerger ( 2017-04-26 03:00:06 -0600 )edit
1

Fix it, thanks.

Svad gravatar imageSvad ( 2017-04-26 03:04:36 -0600 )edit

Thanks to close question

LBerger gravatar imageLBerger ( 2017-04-26 03:06:45 -0600 )edit

I fixed copypaste error from my project to forum, but question is still actual.

Svad gravatar imageSvad ( 2017-04-26 03:11:56 -0600 )edit

if you want to see a result you cannot use Mat(rows, cols, CV_8UC1, cv::Scalar(255)); and filled contour with 255. Use Mat(rows, cols, CV_8UC1, cv::Scalar(0));

LBerger gravatar imageLBerger ( 2017-04-26 04:02:32 -0600 )edit

I fixed it. But drawContours still not work, because it complete before doing something with image.

Svad gravatar imageSvad ( 2017-04-26 04:17:55 -0600 )edit

2 answers

Sort by ยป oldest newest most voted
2

answered 2017-04-26 06:59:32 -0600

Svad gravatar image

Problem solved. In Debug configuration of my test project uses /MD key instead of /MDd(Project->Properties->C/C++->Code Generation->Runtime Library).

edit flag offensive delete link more
1

answered 2017-04-26 05:00:39 -0600

LBerger gravatar image

updated 2017-04-26 05:01:27 -0600

With this code :

Mat Mask = Mat(100, 100, CV_8UC1, cv::Scalar(0));
const vector<Point> obj_corners = { Point(10, 20), Point(10, 40), Point(40, 40), Point(40, 10) };
const vector< vector<Point> >  co_ordinates = { obj_corners };
drawContours(Mask, co_ordinates, 0, Scalar(255), CV_FILLED);
imshow("rrrrr", Mask);
waitKey();

image description

edit flag offensive delete link more

Comments

It works only in x86 build. In x64 drawContours complete before the Mask changes.

Svad gravatar imageSvad ( 2017-04-26 05:45:05 -0600 )edit

No my version is opencv-3.2-dev is x64 with vs 2015. How do you manage x86 and x64 in your project?

LBerger gravatar imageLBerger ( 2017-04-26 05:49:18 -0600 )edit

I create standard Win32 console application instead Qt5 and it works!. But I use Qt 5.5.1, may be the problem in that. Will think. Thanks!

Svad gravatar imageSvad ( 2017-04-26 06:02:24 -0600 )edit

Save image (imwrite("m.png",Mask)) in your qt5 project and open it with paint may be image is good too

LBerger gravatar imageLBerger ( 2017-04-26 06:13:20 -0600 )edit

Question Tools

1 follower

Stats

Asked: 2017-04-26 02:45:16 -0600

Seen: 778 times

Last updated: Apr 26 '17