お世話になってます。
現在大学3年生で最近プログラミングの勉強を始めた者です。
今opencv3を使って複数人の顔方向を検出しようとしているのですが、
急に,カメラキャプチャした後の表示がうまく行かなくなりました。
カメラを開いてからの1枚目の画像が表示されるだけです。
どこを改善したらいいのか、教えていただけるとありがたいです。
開発環境
xcode opencv3 c++
c++
1 2 3#include <iostream> 4#include <opencv2/core.hpp> 5#include <opencv2/highgui.hpp> 6#include <opencv/cv.h> 7#include <opencv/highgui.h> 8#include <stdio.h> 9#include <opencv2/opencv.hpp> 10#include <string> 11#include <math.h> 12#include <opencv2/core/core.hpp> 13#include <opencv2/imgproc/imgproc.hpp> 14#include <opencv2/imgcodecs/imgcodecs.hpp> 15#include <opencv2/imgcodecs/imgcodecs_c.h> 16#include <opencv2/highgui/highgui.hpp> 17#include <opencv/cvaux.h> 18#include <complex> 19 20 21#define _USE_MATH_DEFINES 22 23using namespace cv; 24 25double angle(double a,double b) { 26 27 double c = a - b; 28 double d = double(atan(double(c/10))); 29 // d = d * 180 / M_PI; 30 //printf("angle:%lf\n", d); 31 32 33 return d; 34} 35 36 37int main(int argc, const char * argv[]) { 38 39 printf("start"); 40 41 cv::VideoCapture cap(0); 42 //cv::VideoCapture cap("/usr/local/kenshi/scene6.mp4"); 43 if (!cap.isOpened()) { 44 printf("NO READ"); 45 return -1; 46 } 47 48 // cv::Mat black_img = cv::Mat::zeros(cv::Size(640, 480), CV_8UC3); 49 cap.set(CV_CAP_PROP_FRAME_WIDTH, 640); 50 cap.set(CV_CAP_PROP_FRAME_HEIGHT, 480); 51 52 cv::namedWindow("window", CV_WINDOW_AUTOSIZE); 53 54 std::string cascadeName = "/usr/local/Cellar/opencv3/3.2.0/share/OpenCV/haarcascades/haarcascade_frontalface_default.xml"; 55 56 std::string cascadeName1 = "/usr/local/Cellar/opencv3/3.2.0/share/OpenCV/haarcascades/haarcascade_mcs_nose.xml"; 57 58 cv::CascadeClassifier cascade; 59 cv::CascadeClassifier cascade1; 60 61 if (!cascade.load(cascadeName)) 62 return -1; 63 if (!cascade1.load(cascadeName1)) 64 return -1; 65 66 std::vector<cv::Rect> faces; 67 std::vector<cv::Rect> nose; 68 69 70 int ppl[10]; 71 int facex[10]; 72 int facey[10]; 73 int facer[10]; 74 int b = 0; 75 76 77 78 for (;;) 79 { 80 81 cv::Mat frame; 82 cv::Mat input_image; 83 cv::Mat output_image; 84 cap >> frame; 85 cvtColor(frame, input_image, CV_BGR2GRAY); 86 cv::equalizeHist(input_image, input_image); 87 output_image = frame; 88 flip(output_image, output_image, 1); 89 flip(input_image, input_image, 1); 90 91 cascade.detectMultiScale(input_image, faces, 92 1.3, 3, 93 CV_HAAR_SCALE_IMAGE 94 , 95 cv::Size(50, 50)); 96 97 cascade1.detectMultiScale(input_image, nose, 98 1.3, 3, 99 CV_HAAR_SCALE_IMAGE 100 , 101 cv::Size(50, 50)); 102 103 std::vector<cv::Rect>::const_iterator r = faces.begin(); 104 std::vector<cv::Rect>::const_iterator r1 = nose.begin(); 105 106 int radius; 107 int radius1; 108 109 cv::Point center; 110 for (; r != faces.end(); ++r) { 111 112 center.x = cv::saturate_cast<int>((r->x + r->width*0.5)); 113 center.y = cv::saturate_cast<int>((r->y + r->height*0.5)); 114 radius = cv::saturate_cast<int>((r->width + r->height)*0.25); 115 cv::circle(output_image, center, radius, cv::Scalar(80, 80, 255), 3, 8, 0); 116 117 facex[b] = center.x; 118 facey[b] = center.y; 119 facer[b] = radius; 120 b++; 121 122 123 } 124 125 126 127 cv::Point center1; 128 int k = 0; 129 130 for (; r1 != nose.end(); ++r1) { 131 center1.x = cv::saturate_cast<int>((r1->x + r1->width*0.5)); 132 center1.y = cv::saturate_cast<int>((r1->y + r1->height*0.5)); 133 radius1 = cv::saturate_cast<int>((r1->width + r1->height)*0.25); 134 135 for(int i = 0; i < b; i++){ 136 137 if((facex[i]-center1.x)^2+(facey[i]-center1.y)^2 < facer[i] ^2){ 138 cv::circle(output_image, center1, radius1, cv::Scalar(80, 80, 0), 3, 8, 0); 139 //顔、鼻、角度セットで出力して角度を配列に格納 140 printf("nose(%d,%d)\n", center1.x, center1.y); 141 printf("face(%d,%d)\n", facex[i], facey[i]); 142 printf("radius%d\n", facer[i]); 143 double rad = angle(int(facex[i]), int(center1.x)); 144 145 ppl[k] = rad; 146 printf("k=%d,angle:%f\n", k,rad ); 147 k++; 148 break; 149 } 150 151 152 } 153 154 155 156 157 158 } 159 k=0; 160 b=0; 161 162 163 164 imshow("window", output_image); 165 166 167 cv::waitKey(0); 168 destroyAllWindows(); 169 170 // faces.clear (); 171 //nose.clear(); 172 //faces.shrink_to_fit(); 173 //nose.shrink_to_fit(); 174 } 175 176 177 178 return 0; 179} 180 181 182 183
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/01/16 04:44
2017/01/16 04:47
2017/01/16 05:00