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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
CarlosCarnage
記事: 3
登録日時: 3ヶ月前

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

#1

投稿記事 by CarlosCarnage » 3ヶ月前

[tabs][tabs: ]C[/tabs][tabs][tabs: ]C++[/tabs]

環境は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ではなく標準関数で書きたいと思い頑張っているのですがうまくいきません。どうかお力をお貸していただけないでしょうか?
投稿が初めてゆえに間違いなどがあるかもしれませんがどうかよろしくお願いします。

コードはこちらです。

コード:

#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;
}

かずま

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

#2

投稿記事 by かずま » 3ヶ月前

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

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

コード:

#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;
}

かずま

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

#3

投稿記事 by かずま » 3ヶ月前

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

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


返信

“C言語何でも質問掲示板” へ戻る