合計 昨日 今日
インフォメーション: 当サイトは3/3~3/4に大規模なメンテを実施し大幅リニューアルします。そのため3/3~3/4に長時間の利用停止時間が発生します。ご了承ください。

opencvプログラムの一部を標準関数で書きたい。

フォーラムルール
フォーラムルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Name: CarlosCarnage
[URL]
ぴよぴよ(517 ポイント)
Date: 2018年2月08日(木) 02:21
No: 1
(OFFLINE)

 opencvプログラムの一部を標準関数で書きたい。

 : C
 : C++


環境はWindows10 64ビット
visual studio 2015 community

opencvプログラムの一部を標準関数で書きたいのもcv::VideoCapture cap(0)のcap.set(cv::CAP_PROP_FRAME_WIDTH, 幅)とcap.set(cv::CAP_PROP_FRAME_HEIGHT, 高さ)を用いれば簡単なのですが、勉強のためにこの部分をopencvではなく標準関数で書きたいと思い頑張っているのですがうまくいきません。どうかお力をお貸していただけないでしょうか?
投稿が初めてゆえに間違いなどがあるかもしれませんがどうかよろしくお願いします。

コードはこちらです。
コード[C++]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#include <iostream>
#include <sstream>
#include<stdio.h>
#include<stdlib.h>
#define X_SIZE 1916/*画像の横サイズを定義*/
#define Y_SIZE 181/*画像の縦サイズを定義*/
unsigned char screen[Y_SIZE][X_SIZE][3], compress[Y_SIZE][X_SIZE][3];
 
#include <opencv2/opencv.hpp>
 
using namespace std;
 
void doJob() {
    string path = "";
    string cascadeName = "haarcascade_frontalface_alt.xml";
    cv::CascadeClassifier cascade;
    if (!cascade.load(path + cascadeName)) throw runtime_error(cascadeName + " not found");
 
    /*サイズ変更*/
    int x, y, i;
    for (i = 0; i < 3; i++) {
        for (y = 0; y < Y_SIZE; y++) {
            for (x = 0; x < X_SIZE / 4; x++) {
                compress[y][x][i] = (screen[y][x * 4 + 0][i] + screen[y][x * 4 + 1][i] + screen[y][x * 4 + 2][i] + screen[y][x * 4 + 3][i]) / 4;
            }
        }
    }  //上のプログラム20~27が出力されるウィンドウの大きさを変えるプログラムとして書いたのですがうまく機能しませんプログラム自体は正しくコンパイルできています。//
   
    cv::VideoCapture cap(0);
    if (!cap.isOpened()) throw runtime_error("VideoCapture open failed");
    cv::Mat image;
    cv::Mat gray;
    while (1) {
        cap >> image;
        cv::cvtColor(image, gray, cv::COLOR_BGR2GRAY);
        equalizeHist(gray, gray);
        vector<cv::Rect> founds;
        cascade.detectMultiScale(gray, founds, 1.1, 2, 0 | cv::CASCADE_SCALE_IMAGE, cv::Size(30, 30));
        for (auto faceRect : founds) {
            cv::rectangle(image, faceRect, cv::Scalar(0, 0, 255), 2);
        }
        cv::imshow("video", image);
        auto key = cv::waitKey(1);
        if (key == 'q') break;
    }
    cv::destroyAllWindows();
}
 
int main(int argc, char** argv) {
    try {
        doJob();
    }
    catch (exception &ex) {
        cout << ex.what() << endl;
        string s;
        cin >> s;
    }
    return 0;
}

Name: かずま
[URL]
Date: 2018年2月08日(木) 06:21
No: 2
(OFFLINE)

 Re: opencvプログラムの一部を標準関数で書きたい。

screen も compress もグローバル変数で、0 に初期化されています。
screen から compress を作っても何も変わりません。

image の内容を変更しないといけないでしょう。

コード[C++]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include <iostream>
#include <sstream>
#include <opencv2/opencv.hpp>
 
using namespace std;
 
#define P(x) data[(y * x_size + (x)) * 3 + i]
 
void comp(unsigned char *data, int x_size, int y_size) {
    for (int i = 0; i < 3; i++)
        for (int y = 0; y < y_size; y++)
            for (int x = 0; x < x_size / 4; x++)
                P(x) = (P(x * 4) + P(x * 4 + 1) + P(x * 4 + 2) + P(x * 4 + 3)) / 4;
}
 
void doJob() {
    string path = "C:/opencv/sources/samples/winrt/FaceDetection/FaceDetection/Assets/";
    string cascadeName = "haarcascade_frontalface_alt.xml";
    cv::CascadeClassifier cascade;
    if (!cascade.load(path + cascadeName)) throw runtime_error(cascadeName + " not found");
 
    cv::VideoCapture cap(0);
    if (!cap.isOpened()) throw runtime_error("VideoCapture open failed");
    cv::Mat image;
    cv::Mat gray;
    while (1) {
        cap >> image;
        cv::cvtColor(image, gray, cv::COLOR_BGR2GRAY);
        comp(image.data, image.cols, image.rows);       // +++
        image.cols /= 4;                                // +++
        equalizeHist(gray, gray);
        vector<cv::Rect> founds;
        cascade.detectMultiScale(gray, founds, 1.1, 2, 0 | cv::CASCADE_SCALE_IMAGE, cv::Size(30, 30));
        for (auto faceRect : founds) {
            cv::rectangle(image, faceRect, cv::Scalar(0, 0, 255), 2);
        }
        cv::imshow("video", image);
        auto key = cv::waitKey(1);
        if (key == 'q') break;
    }
    cv::destroyAllWindows();
}
 
int main() {
    try {
        doJob();
    }
    catch (exception &ex) {
        cout << ex.what() << endl;
        string s;
        cin >> s;
    }
    return 0;
}

Name: かずま
[URL]
Date: 2018年2月08日(木) 07:06
No: 3
(OFFLINE)

 Re: opencvプログラムの一部を標準関数で書きたい。

comp の呼び出しと、image.cols /= 4; は、
cv::imshow("video", image); の直前で行わないと、
顔認識の結果がちゃんと表示されないでしょう。

でも、横方向に圧縮して何がしたいのでしょうか?
また、標準関数は使っていないのですが、
私が何か勘違いをしているのでしょうか?

Name: usao
[URL]
ハッカー(142,819 ポイント)
Date: 2018年2月08日(木) 10:51
No: 4
(OFFLINE)


Return to C言語何でも質問掲示板

オンラインデータ

このフォーラムを閲覧中のユーザー: なし & ゲスト[12人]